2008-09-12 27 views
126

Ich versuche, ein Ereignis zu feuern, wenn eine Wahl von einer JComboBox getroffen wird.JComboBox Auswahl Ändern Listener?

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

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

Kurz vor dem Überschreiben des Modells für die JComboBox Ich bin aus Ideen.

Wie werde ich über eine Auswahländerung auf einer JComboBox benachrichtigt?

Edit: Ich habe zu entschuldigen es stellt sich heraus, dass ich eine abgestürzten Unterklasse von JComboBox, aber ich werde die Frage überlassen, da Ihre Antwort ist gut. Beginne die Abstimmung. :)

+0

Ausgezeichnete Frage, da ich bemerkt habe, dass eine Combobox beim Laden actionPerformed feuert, aber die Auswahl nicht auf, wenn man würde es erwarten. –

Antwort

129

Es sollte ActionListeners, wie diese reagieren:

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

@John Calsbeek zu Recht darauf hin, dass addItemListener() funktionieren auch. Sie können jedoch 2 ItemEvents erhalten, eines für die Abwahl des zuvor ausgewählten Elements und eines für die Auswahl des neuen Elements. Benutze einfach nicht beide Eventtypen!

+42

Ich würde ItemListener bevorzugen (stellen Sie sicher, dass Sie das ItemEvent überprüfen, um zu sehen, ob es sich um eine Auswahl oder Abwahl handelt).Der ActionListener kann ausgelöst werden, auch wenn sich die Auswahl nicht geändert hat (d. H. Wenn der Benutzer auf das bereits ausgewählte Element klickt). Dies kann oder kann nicht sein, was Sie wollen. –

+4

Ich weiß, dass diese Frage alt ist, aber um sie zu ergänzen, wird ActionListener auch ausgelöst, wenn die addItem-Methode aufgerufen wird. –

21

Ich würde versuchen, die itemStateChanged() Methode der ItemListener Schnittstelle, wenn Jodonnell-Lösung fehlschlägt.

7

können Sie versuchen, diese

int selectedIndex = myComboBox.getSelectedIndex(); 

-oder

Object selectedObject = myComboBox.getSelectedItem(); 

-oder

String selectedValue = myComboBox.getSelectedValue().toString(); 
+0

Ich weiß, warum dies abgelehnt wurde, aber ich glaube, diese Downvotes sollten überdacht werden ... Wenn Sie den ausgewählten Index in der Methode actionPerformed überprüfen, werden Sie feststellen, dass dies funktioniert. Es wird ausgelöst, und der Ausschluss von -1 Ereignissen ermöglicht es Ihnen, die Fehlzündung beim Start auszuschließen. Löste mein Problem! –

132

Codebeispiel von ItemListener Implementierung

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 ausgewählte Artikel.

Dann fügen Sie nur Zuhörer zu Ihrem JComboBox

addItemListener(new ItemChangeListener()); 
+1

Ich habe diesen Code versucht, ein Problem ist, dass, wenn ich auf das Element klicken, das bereits ausgewählt ist, der Listener nicht ausgelöst wird, da es keine Statusänderung gibt. – dmark

+3

@dmark Ich denke, das ist vernünftig, denn nichts wurde geändert. Vielleicht solltest du deine Aktionen irgendwie reorganisieren, um nicht von einem solchen Szenario abhängig zu sein. – Viacheslav

+0

@dmark Danke, Ihr Kommentar hat mir geholfen, eine Frage zu lösen :) – Tia

4

ich für diese gleiche Lösung vor kurzem war auf der Suche und verwaltet, ohne die Zuordnung bestimmte Variablen für das zuletzt gewählte Element und das neue ausgewählten Element einen einfachen zu finden. Und diese Frage, obwohl sehr hilfreich, lieferte nicht die Lösung, die ich brauchte. Das hat mein Problem gelöst, ich hoffe es löst euch und andere. Vielen Dank.

How do I get the previous or last item?

7

Hier ist die Schaffung eines ComboBox einen Listener für Artikelauswahl ändern Zugabe:

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 
     } 
    }); 
} 
+2

diese Antworten verbessert frühere Antworten in diesem ...? Bitte nicht duplizieren! Ohne Bezug: Niemals manuelle Dimensionierung/Lokalisierung von Komponenten, das ist die ausschließliche Aufgabe eines geeigneten LayoutManagers – kleopatra