Слухач зміни вибору JComboBox?


145

Я намагаюсь отримати подію, щоб звільнити кожного разу, коли буде зроблений вибір з JComboBox.

Проблема, яку я маю, полягає в тому, що явного addSelectionListener()методу немає .

Я намагався використовувати actionPerformed(), але це ніколи не спрацьовує.

Не маючи переоцінки моделі для JComboBox, я не маю ідеї.

Як мені отримати повідомлення про зміну вибору JComboBox? **

Редагувати: я повинен вибачитися. Виявляється, я використовував непокласний підклас JComboBox, але я залишу це питання, оскільки ваша відповідь хороша.


Відмінне запитання, оскільки я помітив, що actionPerformed спрацьовує під час завантаження комбінованої скриньки, але НЕ щодо вибору, коли можна було б цього очікувати.
Брайан Ноблеуч

Відповіді:


160

Він повинен відповідати ActionListeners , як це:

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

@John Calsbeek справедливо зазначає, що теж addItemListener()буде працювати. ItemEventsОднак ви можете отримати 2 , один для скасування виділення раніше вибраного елемента та інший для вибору нового елемента. Просто не використовуйте обидва типи подій!


45
Я вважаю за краще ItemListener (просто переконайтесь, що перевірте ItemEvent, щоб побачити, чи є це виділення чи скасування вибору). ActionListener можна запустити, навіть якщо вибір не змінився (тобто якщо користувач натискає вже вибраний елемент). Це може бути або не бути тим, що ви хочете.
Дан Дайер

6
Я знаю, що це питання давнє, але для доповнення ActionListener також звільняється, якщо викликається метод addItem.
Габріель Камара

150

Кодовий приклад ItemListenerреалізації

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

Тепер ми отримаємо лише вибраний товар.

Тоді просто додайте слухача до свого JComboBox

addItemListener(new ItemChangeListener());

2
Я спробував цей код, одна проблема полягає в тому, що коли я натискаю на вже вибраний елемент, слухач не буде спрацьовувати, оскільки немає зміни стану.
позначка

4
@dmark Я думаю, що це розумно, тому що нічого не змінилося. Можливо, вам слід якось реорганізувати свої дії, щоб не залежати від такого сценарію.
В’ячеслав

@dmark Спасибі, ваш коментар допоміг мені вирішити питання :)
Тіа


11

Тут створено ComboBox, який додає слухача для зміни вибору елементів:

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
ця відповідь підсилює попередні відповіді в тому, що ...? Будь ласка, не дублюйте! Непов’язане: ніколи не роби будь-яке ручне розміщення / розміщення компонентів, це ексклюзивне завдання відповідного LayoutManager
kleopatra

7

Ви можете спробувати ці

 int selectedIndex = myComboBox.getSelectedIndex();

або

Object selectedObject = myComboBox.getSelectedItem();

або

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

Я знаю, чому це було знято, але я вважаю, що ці голоси повинні бути переглянуті ... Якщо ви перевірите вибраний індекс у методі actionPerformed, ви побачите, що це працює. Це спрацьовує, і виключення -1 подій дозволить вам виключити помилкові стрільби при старті. Вирішив мою проблему!
Брайан Ноблеуч

4

Нещодавно я шукав це саме рішення і мені вдалося знайти просте, не призначаючи конкретні змінні для останнього вибраного елемента та нового вибраного елемента. І це питання, хоч і було дуже корисним, не забезпечило потрібне мені рішення. Це вирішило мою проблему, я сподіваюся, що вона вирішить ваші та інші. Дякую.

Як отримати попередній або останній товар?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.