Odbiornik zmiany wyboru JComboBox?


145

Próbuję wywołać zdarzenie za każdym razem, gdy wybierany jest plik JComboBox.

Problem polega na tym, że nie ma oczywistej addSelectionListener()metody.

Próbowałem użyć actionPerformed(), ale nigdy nie odpala.

Brakuje mi zastąpienia modelu dla JComboBox, nie mam pomysłów.

Jak mogę otrzymać powiadomienie o zmianie wyboru na JComboBox? **

Edycja: muszę przeprosić. Okazuje się, że użyłem źle zachowującej się podklasy JComboBox, ale zostawię to pytanie, ponieważ twoja odpowiedź jest dobra.


Świetne pytanie, ponieważ zauważyłem, że actionPerformed uruchamia się po załadowaniu combobox, ale NIE po wybraniu, kiedy można się tego spodziewać.
Brian Knoblauch

Odpowiedzi:


160

Powinien odpowiadać na ActionListeners , na przykład:

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

@John Calsbeek słusznie wskazuje, że addItemListener()to też zadziała. Możesz jednak dostać 2 ItemEvents, jeden za odznaczenie poprzednio wybranej pozycji, a drugi za wybór nowej pozycji. Po prostu nie używaj obu typów wydarzeń!


45
Wolałbym ItemListener (po prostu upewnij się, że sprawdziłeś ItemEvent, aby zobaczyć, czy jest to nawet zaznaczenie lub odznaczenie). ActionListener można uruchomić, nawet jeśli zaznaczenie nie uległo zmianie (tj. Jeśli użytkownik kliknie na już wybrany element). To może być to, czego chcesz, ale nie musi.
Dan Dyer,

6
Wiem, że to pytanie jest stare, ale w celu uzupełnienia, ActionListener jest również uruchamiany, jeśli wywoływana jest metoda addItem.
Gabriel Câmara

150

Przykład kodu ItemListenerimplementacji

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

Teraz otrzymamy tylko wybraną pozycję.

Następnie po prostu dodaj odbiornik do swojego JComboBox

addItemListener(new ItemChangeListener());

2
Wypróbowałem ten kod, jednym problemem jest to, że po kliknięciu elementu, który jest już wybrany, odbiornik nie zostanie uruchomiony, ponieważ nie ma zmiany stanu.
dmark

4
@dmark Myślę, że to rozsądne, ponieważ nic nie zostało zmienione. Może powinieneś jakoś przeorganizować swoje działania, aby nie polegać na takim scenariuszu.
Viacheslav

@dmark Dzięki, Twój komentarz pomógł mi rozwiązać pytania :)
Tia,


11

Oto tworzenie ComboBox dodającego odbiornik dla zmiany wyboru elementu:

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
ta odpowiedź wzmacnia poprzednie odpowiedzi w tym ...? Proszę nie powielać! Niepowiązane: nigdy, przenigdy nie wykonuj ręcznego wymiarowania / lokalizowania komponentów, to wyłączne zadanie odpowiedniego menedżera LayoutManager
kleopatra

7

Możesz spróbować tych

 int selectedIndex = myComboBox.getSelectedIndex();

-lub-

Object selectedObject = myComboBox.getSelectedItem();

-lub-

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

Wiem, dlaczego głosy przeciwne zostały odrzucone, ale uważam, że te głosy przeciwne powinny zostać ponownie rozważone ... Jeśli zaznaczysz wybrany indeks w metodzie actionPerformed, przekonasz się, że to działa. Strzela, a wykluczenie zdarzeń -1 pozwoli ci wykluczyć fałszywe strzelanie na starcie. Rozwiązał mój problem!
Brian Knoblauch,

4

Ostatnio szukałem tego samego rozwiązania i udało mi się znaleźć proste bez przypisywania konkretnych zmiennych do ostatnio wybranej pozycji i nowo wybranej pozycji. I to pytanie, choć bardzo pomocne, nie zapewniło mi rozwiązania, którego potrzebowałem. To rozwiązało mój problem, mam nadzieję, że rozwiązuje twój i innych. Dzięki.

Jak zdobyć poprzedni lub ostatni przedmiot?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.