JComboBox Auswahl Listener ändern?

145

Ich versuche, ein Ereignis zum Feuern zu bringen, wenn eine Auswahl aus a getroffen wird JComboBox.

Das Problem, das ich habe, ist, dass es keine offensichtliche addSelectionListener()Methode gibt.

Ich habe versucht zu verwenden actionPerformed(), aber es wird nie ausgelöst.

Ohne das Modell für das zu überschreiben JComboBox, habe ich keine Ideen mehr.

Wie werde ich über eine Auswahländerung bei a benachrichtigt JComboBox? **

Edit: Ich muss mich entschuldigen. Es stellt sich heraus, dass ich eine schlecht benommene Unterklasse von verwendet habe JComboBox, aber ich werde die Frage offen lassen, da Ihre Antwort gut ist.

Allain Lalonde
quelle
Ausgezeichnete Frage, da ich bemerkt habe, dass actionPerformed beim Laden einer Combobox ausgelöst wird, aber NICHT bei der Auswahl, wann man es erwarten würde.
Brian Knoblauch

Antworten:

160

Es sollte auf ActionListener wie folgt reagieren :

combo.addActionListener (new ActionListener () {
    public void actionPerformed(ActionEvent e) {
        doSomething();
    }
});

@ John Calsbeek weist zu Recht darauf hin, dass dies addItemListener()auch funktionieren wird. Möglicherweise erhalten Sie jedoch 2 ItemEvents, eine für die Abwahl des zuvor ausgewählten Elements und eine für die Auswahl des neuen Elements. Verwenden Sie einfach nicht beide Ereignistypen!

Jodonnell
quelle
45
Ich würde ItemListener bevorzugen (überprüfen Sie einfach das ItemEvent, um festzustellen, ob es sich um eine Auswahl oder eine Abwahl handelt). Der ActionListener kann auch dann ausgelöst werden, wenn sich die Auswahl nicht geändert hat (dh wenn der Benutzer auf das bereits ausgewählte Element klickt). Dies kann oder kann nicht sein, was Sie wollen.
Dan Dyer
6
Ich weiß, dass diese Frage alt ist, aber zur Ergänzung wird ActionListener auch ausgelöst, wenn die addItem-Methode aufgerufen wird.
Gabriel Câmara
150

Codebeispiel für die ItemListenerImplementierung

class ItemChangeListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // do something with object
       }
    }       
}

Jetzt erhalten wir nur noch ausgewählte Artikel.

Fügen Sie dann einfach einen Listener zu Ihrer JComboBox hinzu

addItemListener(new ItemChangeListener());
Viacheslav
quelle
2
Ich habe diesen Code ausprobiert. Ein Problem besteht darin, dass der Listener nicht ausgelöst wird, wenn ich auf das bereits ausgewählte Element klicke, da keine Statusänderung erfolgt.
Dmark
4
@dmark Ich denke das ist vernünftig, weil nichts geändert wurde. Vielleicht sollten Sie Ihre Aktionen irgendwie neu organisieren, um nicht von einem solchen Szenario abhängig zu sein.
Viacheslav
@dmark Danke, Ihr Kommentar hat mir geholfen, eine Frage zu lösen :)
Tia
22

Ich würde die itemStateChanged()Methode der ItemListenerSchnittstelle ausprobieren, wenn Jodonnells Lösung fehlschlägt.

John Calsbeek
quelle
11

Hier wird eine ComboBox erstellt, in der ein Listener für die Änderung der Elementauswahl hinzugefügt wird:

JComboBox comboBox = new JComboBox();

comboBox.setBounds(84, 45, 150, 20);
contentPane.add(comboBox);

JComboBox comboBox_1 = new JComboBox();
comboBox_1.setBounds(84, 97, 150, 20);
contentPane.add(comboBox_1);
comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        //Do Something
    }
});
Ahuramazda
quelle
3
Diese Antwort verbessert frühere Antworten darin, dass ...? Bitte nicht duplizieren! Unabhängig: Führen Sie niemals eine manuelle Dimensionierung / Lokalisierung von Komponenten durch.
Dies
7

Sie können diese versuchen

 int selectedIndex = myComboBox.getSelectedIndex();

-oder-

Object selectedObject = myComboBox.getSelectedItem();

-oder-

String selectedValue = myComboBox.getSelectedValue().toString();
JavaKeith
quelle
Ich weiß, warum dies abgelehnt wurde, aber ich glaube, diese Abstimmungen sollten überdacht werden ... Wenn Sie den ausgewählten Index in der actionPerformed-Methode überprüfen, werden Sie feststellen, dass dies funktioniert. Es wird ausgelöst, und wenn Sie -1 Ereignisse ausschließen, können Sie das falsche Auslösen beim Start ausschließen. Mein Problem gelöst!
Brian Knoblauch
4

Ich habe kürzlich nach der gleichen Lösung gesucht und es geschafft, eine einfache zu finden, ohne bestimmte Variablen für das zuletzt ausgewählte Element und das neu ausgewählte Element zuzuweisen. Und diese Frage war zwar sehr hilfreich, bot aber nicht die Lösung, die ich brauchte. Dies hat mein Problem gelöst, ich hoffe es löst dein und andere. Vielen Dank.

Wie bekomme ich den vorherigen oder letzten Artikel?

Craig Wayne
quelle