Слухач зміни вибору 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.