2016-12-02 8 views
0

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 
      } 
     } 

    } 
+0

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. –

+1

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) –

+1

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. –

Antwort

0

Nun, ich glaube, Sie in dieses Problem lief, weil Ihr Setup fehlerhaft ist. Die einzige Möglichkeit, die ich sehe, ist das Erstellen einer GetSelectedNameBox() -Methode in dieser Top-Panel-Klasse und einer set-Methode in Ihrer Center-Panel-Klasse.

Also in Ihrem Gui Klasse würden Sie tun so etwas wie:

String temp = topPanel.getSelectedNamebox();

Und dann würden Sie tun centerPanel.setXXXX (temp);

Sie können sehen, dass in dem Bemühen, einen lesbaren Code zu erstellen, indem es die Dinge aufteilt, es Lesbarkeit wahrscheinlich verschlechtert. Außerdem ist dies nicht der richtige Gebrauch von Gettern und Setter.

Ich würde neu konfigurieren, und legen Sie alle Ihre verschiedenen JPanels in der gleichen Klasse. Ich würde mich auch darauf konzentrieren, anonyme Klassen anstelle von inneren Klassen für Ihre actionListeners zu verwenden. Dies wird Ihren Code sehr verkürzen. Und entfernen Sie alle Leerzeilen: P

Verwandte Themen