Ich habe eine GUI-Klasse, die den JFrame erweitert. Ich habe die JPanels für die Lesbarkeit des Codes getrennt. Ich habe die Combobox von oben definiert und möchte auf das ausgewählte Element zu meinem mittleren Panel zugreifen. Mein Mittelfeld ist ein Rasterfeld, das anklickbar ist. Wie kann ich auf das ausgewählte Element aus dem Kombinationsfeld innerhalb meines BoxListener-Ereignisses zugreifen?Zugriff auf Komponenten von einem JPanel zu einem anderen JPanel
Mein Code geht hier:
//Gui ==================================================
public class Gui extends JFrame {
final int WINDOW_WIDTH = 1000; // Window width in pixels
final int WINDOW_HEIGHT = 800; // Window height in pixels
private TopPanel topPanel;
private CenterPanel centerPanel;
public SchedulerGui() {
// Display the title
setTitle("Class Scheduler");
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
// specify action for the close button
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create border layout
setLayout(new BorderLayout());
// create the custom panels;
topPanel = new TopPanel();
centerPanel = new CenterPanel(15,7);
// Add it to the content pane
add(topPanel, BorderLayout.NORTH);
add(centerPanel, BorderLayout.CENTER);
setVisible(true);
}
public static void main(String args[]) {
new Gui();
}
}
//top panel =====================================================
public class TopPanel extends JPanel {
JLabel labelCurrentStatus;
// create combo boxes
public JComboBox nameBox;
String[] listNameBox = { "Select Box”, “Box1”, “Box2”, “Box3”};
String selectedNameBox = "";
public TopPanel() {
nameBox = new JComboBox(listNameBox);
// Register an action listener
nameBox.addActionListener(new ComboBoxListener());
// add the combo boxes into the content pane
add(nameBox);
}
private class ComboBoxListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
selectedNameBox = (String) nameBox.getSelectedItem();
labelCurrentStatus.setText(selectedNameBox);
}
}
}
//center panel ================================================
// creates panel grids that is clickable
public class CenterPanel extends JPanel {
public CenterPanel(int row, int col) {
setLayout(new GridLayout(row, col));
setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
JPanel pan = new JPanel();
pan.setEnabled(true);
pan.setBackground(Color.WHITE);
pan.setPreferredSize(new Dimension(3, 3));
pan.setBorder(BorderFactory.createLineBorder(Color.BLACK));
// an exception to not click the top row and most left column headers
if (i != 0 && j != 0) {
pan.addMouseListener(new BoxListener()); // add a mouse listener to make the panels clickable
}
// set names for each panel for later use
pan.setName("PANEL_" + i + "_" + j);
add(pan);
}
}
}
//Class that defines what happens when a panel is clicked
public static class BoxListener extends MouseAdapter
{
public void mouseClicked(MouseEvent me)
{
JPanel clickedBox =(JPanel)me.getSource();
clickedBox.setBackground(Color.RED);
// insert here the code defining what happens when a grid is clicked.
// Need to access the value of the selected item from the combo box
}
}
}
Am besten zu versuchen, MVC-ice Ihren Code, trennen Sie die Logik aus der Sicht, wenn möglich. Außerdem sollte keines Ihrer Felder "öffentlich" sein und in der Tat sollten alle "privat" sein. Jede Kommunikation zwischen Objekten sollte durch öffentliche Methoden kontrolliert erfolgen. –
Arggghhh braucht zu viel Zeit, um ein MVC-Beispiel zu erstellen. tdel, - check out @ trashgods exzellentes Beispiel: [hier] (http://stackoverflow.com/questions/10523343/how-to-wire-one-pane-to-another) –
Hinweis: 'Gui' sollte nicht erweitert werden 'JFrame', und weder' TopPanel' noch 'CenterPanel' sollten' JPanel' erweitern. In allen drei Fällen sollte der Code nur einfache Instanzen der Komponente verwenden und ihnen dann andere Komponenten hinzufügen. –