Selezione listener di JComboBox?


145

Sto cercando di far sparare un evento ogni volta che viene fatta una scelta da a JComboBox.

Il problema che sto riscontrando è che non esiste un addSelectionListener()metodo ovvio .

Ho provato a usare actionPerformed(), ma non si accende mai.

A corto di scavalcare il modello per il JComboBox, sono senza idee.

Come posso essere avvisato di una modifica della selezione su un JComboBox? **

Modifica: devo scusarmi. Si scopre che stavo usando una sottoclasse di comportamento scorretto di JComboBox, ma lascerò la domanda in alto poiché la tua risposta è buona.


Ottima domanda, dato che ho notato che ActionPerformed si attiva quando si carica una casella combinata, ma NON quando si seleziona quando ci si aspetterebbe.
Brian Knoblauch,

Risposte:


160

Dovrebbe rispondere ad ActionListeners , in questo modo:

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

@John Calsbeek sottolinea giustamente che addItemListener()funzionerà anche. Puoi ottenere 2 ItemEvents, tuttavia, uno per la deselezione dell'elemento precedentemente selezionato e un altro per la selezione del nuovo elemento. Basta non usare entrambi i tipi di evento!


45
Preferirei ItemListener (assicurati di controllare ItemEvent per vedere se si tratta di una selezione o di una deselezione). ActionListener può essere attivato anche se la selezione non è cambiata (ovvero se l'utente fa clic sull'elemento già selezionato). Questo può o meno essere quello che vuoi.
Dan Dyer,

6
So che questa domanda è vecchia, ma per completare, ActionListener viene anche generato se viene chiamato il metodo addItem.
Gabriel Câmara,

150

Esempio di codice di ItemListenerimplementazione

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

Ora avremo solo l'oggetto selezionato.

Quindi aggiungi il listener al tuo JComboBox

addItemListener(new ItemChangeListener());

2
Ho provato questo codice, un problema è che quando faccio clic sull'elemento che è già selezionato, l'ascoltatore non verrà attivato, poiché non vi è alcun cambiamento di stato.
mark

4
@dmark Penso che questo sia ragionevole, perché nulla è stato cambiato. Forse dovresti riorganizzare le tue azioni in qualche modo per non dipendere da tale scenario.
Viacheslav,

@dmark Grazie, il tuo commento mi ha aiutato a risolvere una domanda :)
Tia,


11

Qui sta creando un ComboBox che aggiunge un listener per la modifica della selezione degli oggetti:

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

3
questa risposta migliora le risposte precedenti in quanto ...? Per favore, non duplicare! Non collegato: mai-mai fatto alcun dimensionamento manuale / individuazione dei componenti, questo è il compito esclusivo di un LayoutManager adatto
Kleopatra

7

Puoi provare questi

 int selectedIndex = myComboBox.getSelectedIndex();

-o-

Object selectedObject = myComboBox.getSelectedItem();

-o-

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

So perché questo è stato downvoted, ma credo che quei downvotes debbano essere riconsiderati ... Se controlli l'indice selezionato nel metodo actionPerformed, scoprirai che funziona. Fa fuoco e l'esclusione di -1 eventi ti permetterà di escludere il falso fuoco all'avvio. Risolto il mio problema!
Brian Knoblauch,

4

Recentemente stavo cercando questa stessa soluzione e sono riuscito a trovarne una semplice senza assegnare variabili specifiche per l'ultimo elemento selezionato e il nuovo elemento selezionato. E questa domanda, sebbene molto utile, non ha fornito la soluzione di cui avevo bisogno. Questo ha risolto il mio problema, spero che risolva il tuo e gli altri. Grazie.

Come posso ottenere l'articolo precedente o l'ultimo?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.