JComboBox Выбор Изменить Слушатель?


145

Я пытаюсь заставить событие срабатывать всякий раз, когда делается выбор из JComboBox.

Проблема в том, что у меня нет очевидного addSelectionListener()метода.

Я пытался использовать actionPerformed(), но он никогда не срабатывает.

Если не считать переопределения модели JComboBox, у меня нет идей.

Как получить уведомление об изменении выбора на JComboBox? **

Изменить: я должен извиниться. Оказывается, я использовал подкласс неправильного поведения JComboBox, но я оставлю вопрос, так как ваш ответ хорош.


Отличный вопрос, так как я заметил, что actionPerformed запускается при загрузке комбо-бокса, но НЕ при выборе, когда этого можно ожидать.
Брайан Кноблаух

Ответы:


160

Он должен отвечать на ActionListeners , вот так:

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

@ Джон Калсбек справедливо указывает, что addItemListener()это тоже сработает. Вы можете получить 2 ItemEvents, однако, один для отмены выбора ранее выбранного элемента, а другой для выбора нового элемента. Только не используйте оба типа событий!


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 Спасибо, ваш комментарий помог мне решить квест :)
Tia


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.