2008-09-12 14 views
126

Próbuję wywołać zdarzenie, gdy dokonano wyboru z poziomu JComboBox.Monitorowanie zmian zestawu JComboBox?

Problem, który mam, polega na tym, że nie ma oczywistej metody addSelectionListener().

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

Krótki z pominięciem modelu dla JComboBox Brakuje mi pomysłów.

Jak uzyskać powiadomienie o zmianie wyboru na JComboBox?

Edit: muszę przeprosić okazuje się, używałem podklasę wadliwie z JComboBox, ale zostawię to pytanie się ponieważ odpowiedź jest dobra. Rozpocznij głosowanie. :)

+0

Doskonałe pytanie, ponieważ zauważyłem, że actionPerformed pożary na ładowanie combobox, ale nie na wyborze, gdy jeden Spodziewałbym się tego. –

Odpowiedz

129

Należy odpowiedzieć na ActionListeners, tak:

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

@John Calsbeek słusznie zwraca uwagę, że addItemListener() zadziała też. Możesz otrzymać 2 ItemEvents, jeden dla cofnięcia wyboru wcześniej wybranego elementu, a drugi dla wyboru nowego elementu. Po prostu nie używaj obu typów wydarzeń!

+42

Wolałbym ItemListener (po prostu upewnij się, aby sprawdzić ItemEvent, aby zobaczyć, czy jest to zaznaczenie lub cofnij wybór).ActionListener może zostać uruchomiony, nawet jeśli wybór nie został zmieniony (tj. Jeśli użytkownik kliknie na już wybrany element). To może, ale nie musi być to, co chcesz. –

+4

Wiem, że to pytanie jest stare, ale w celu uzupełnienia, ActionListener jest również zwalniany, jeśli wywoływana jest metoda addItem. –

21

Chciałbym wypróbować metodę itemStateChanged() interfejsu ItemListener, jeśli rozwiązanie jodonnell zawiedzie.

7

Możesz spróbować te

int selectedIndex = myComboBox.getSelectedIndex(); 

-lub-

Object selectedObject = myComboBox.getSelectedItem(); 

-lub-

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

Wiem, dlaczego to zostało odrzucone, ale uważam, że te opinie powinny zostać ponownie rozważone ... Jeśli sprawdzisz wybrany indeks w metodzie actionPerformed, przekonasz się, że to działa. Wystrzeliwuje, a wykluczenie -1 zdarzeń pozwoli ci wykluczyć fałszywe ostrzał na starcie. Rozwiązałem mój problem! –

132

przykładowy kod z ItemListener realizacji

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 wybrany przedmiot.

Następnie wystarczy dodać słuchacza do JComboBox

addItemListener(new ItemChangeListener()); 
+1

Próbowałem tego kodu, jednym problemem jest to, że po kliknięciu elementu, który jest już wybrany, detektor nie zostanie uruchomiony, ponieważ nie ma zmiany stanu. – dmark

+3

@dmark Myślę, że jest to uzasadnione, ponieważ nic się nie zmieniło. Może powinieneś jakoś zreorganizować swoje działania, aby nie polegać na takim scenariuszu. – Viacheslav

+0

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

4

Byłem niedawno szuka tego samego rozwiązania i udało się znaleźć jeden prosty bez przypisywania konkretnych zmiennych dla ostatniego wybranego elementu i nowego wybranego elementu. I to pytanie, choć bardzo pomocne, nie dostarczyło rozwiązania, którego potrzebowałem. To rozwiązało mój problem, mam nadzieję, że rozwiązuje on twój i innych. Dzięki.

How do I get the previous or last item?

7

Tutaj tworzy ComboBox dodając słuchacza na zmianę wyboru pozycji:

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

ta odpowiedź wzmacnia poprzednie odpowiedzi w tym ...? Nie duplikuj! Niezwiązane: nigdy nie dokonuj ręcznego wymiarowania/lokalizowania komponentów, to jest wyłącznym zadaniem odpowiedniego menedżera LayoutManager – kleopatra