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!
Implementieren Sie einen 'ChaneListener' oder' ActionListener', der interessierte Parteien benachrichtigen kann, dass sich der Status Ihrer benutzerdefinierten Komponente geändert hat – MadProgrammer
"Die erste JComboBox hat ON/OFF-Optionen" Warum nicht einen JToggleButton verwenden? –