2016-05-20 12 views
0

Ich habe eine benutzerdefinierte Klasse CustomField, die JPanel erweitert. Da ich oft dasselbe Muster verwenden muss, besteht meine benutzerdefinierte Klasse aus 2 JLabels und 2 JComboBox. Es ist ziemlich einfach; Die erste JComboBox hat ON/OFF-Optionen und die zweite JComboBox ist nur sichtbar, wenn die erste auf "ON" gesetzt ist. Ich kann diesen Teil verwalten. Der Teil, den ich nicht weiß, wer es gut zu entwerfen ist, dass CustomField-Instanzen in einer anderen Klasse sind, die der Haupt-JFrame ist und in diesem JFrame sind einige Teile nur sichtbar, wenn die JComboBox aus der CustomField-Klasse auf " AUF". Ich habe über einen MouseAdapter nachgedacht, aber ich weiß nicht, dass es eine gute Übung ist.Hinzufügen von Listener zu JPanel

Hier ist meine Custom Klasse:

public class CustomField extends JPanel { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    JLabel text, portText; 
    JComboBox<String> testCB, option; 

    public CustomField(String text, String opt, String tst) { 
     this.text = new JLabel(text); 

     String[] onOffOpt= {"OFF", "ON"}; 
     this.option = new JComboBox<String>(onOffOpt); 
     this.option.setSelectedItem(opt); 
     this.option.addItemListener(new ItemListener(){ 
      @Override 
      public void itemStateChanged(ItemEvent ie) { 
       portText.setVisible(option.getSelectedIndex() == 1); 
       testCB.setVisible(option.getSelectedIndex() == 1); 
      } 
     }); 

     this.portText = new JLabel("Test:"); 

     String[] testChoices = {"Test", "Test2"}; 
     this.testCB = new JComboBox<String>(testChoices); 
     this.testCB.setSelectedItem(tst); 

     this.setLayout(new FlowLayout()); 
     add(this.text); 
     add(this.option); 
     add(this.portText); 
     add(this.testCB); 
    } 
} 

Und hier ist der Haupt JFrame:

public class Main { 
    CustomField cf = new CustomField("test", "ON, "Test2"); 
    public static void main(String s[]) { 

     JFrame frame = new JFrame("Application"); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 


     panel.add(cf); 

     JLabel labelTest = new JLabel("Label that should be visible or not"); 
     panel.add(labelTest); 

     frame.add(panel); 
     frame.setSize(300, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 
} 

Grundsätzlich möchte ich, dass die labelTest visibily ändert sich entsprechend der Einstellungen Custom. In der Art, wie es gemacht wird, kann ich den labelTest nicht in die CustomField-Klasse setzen.

Gibt es einen sauberen Weg zu tun, was ich will? Soll ich das Ding neu gestalten und alle Felder in die gleiche Klasse legen?

Dank!

+0

Implementieren Sie einen 'ChaneListener' oder' ActionListener', der interessierte Parteien benachrichtigen kann, dass sich der Status Ihrer benutzerdefinierten Komponente geändert hat – MadProgrammer

+0

"Die erste JComboBox hat ON/OFF-Optionen" Warum nicht einen JToggleButton verwenden? –

Antwort

0

Erstens wollen Sie die Combobox des Staates mit einem Verfahren in Custom aussetzen: kann

public boolean isOn() { 
    return testCB.getSelectedIndex() == 1; 
} 

Sie eine Idee dafür bekommen, wie zum Zustand hören, indem man die Methodensignaturen in der Dokumentation für verschiedene Schwingen erfolgt Komponenten, die den Standard JavaBean Zuhörer Muster verwenden: Sie werden drei öffentliche Methoden hinzufügen möchten, und eine geschützte Methode: (. Das ListenerList Feld wird von JComponent geerbt)

public void addChangeListener(ChangeListener listener) { 
    listenerList.add(ChangeListener.class, listener); 
} 

public void removeChangeListener(ChangeListener listener) { 
    listenerList.remove(ChangeListener.class, listener); 
} 

public ChangeListener[] getChangeListeners() { 
    return listenerList.getListeners(ChangeListener.class); 
} 

protected void fireChangeListeners() { 
    ChangeEvent event = new ChangeEvent(this); 
    for (ChangeListener listener : getChangeListeners()) { 
     listener.stateChanged(event); 
    } 
} 

Jetzt können Sie einfach einen Anruf zu fireChangeListeners(); hinzufügen, wenn Sie feststellen, dass der Benutzer den Wert der On/Off-Combobox geändert hat, dh Sie möchten ihn in Ihrem ItemListener aufrufen.

Wie Sie wahrscheinlich vermuten können, kann Ihre Main-Klasse jetzt cf.addChangeListener aufrufen und innerhalb dieses Listeners die Sichtbarkeit Ihres Labels basierend auf dem von cf.isOn() zurückgegebenen Wert anpassen.

Sie können viel mehr lernen, indem Sie these lesen.

+0

Das hat sehr geholfen! Vielen Dank! – Synor