Java Swbo Combo Box только вызывает слушатель один раз - PullRequest
2 голосов
/ 19 декабря 2011

Очень плохо знаком с Java и Swing, и я играю с приложением Swi Gui.Он сгенерировал некоторый код для моего поля со списком:

comboBox.addActionListener(EventHandler.create(ActionListener.class, TestController, "changeSomething"));

, и у меня также есть это:

import javax.swing.JComboBox;
import javax.swing.JOptionPane;

public class StudyPlanController {
    private JComboBox factors;

    public void changeSomething() {
        JOptionPane.showMessageDialog(null, "change!");
    }
}

У меня есть 2 вопроса.

  1. Когда я изменяю выбранный элемент в поле со списком, я получаю сообщение «изменить!»только в первый раз это меняется.Почему это так?

  2. При поиске решения проблемы весь код для настройки прослушивателя отличался от кода, сгенерированного для меня.например,

    box.addItemListener (new ItemListener () {public void itemStateChanged (ItemEvent e) {System.out.println (e.getItem () + "" + e.getStateChange ());}});

Как правильно создать слушателя?почему есть два способа сделать это?

Спасибо

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Сначала ответ о EventHandler.Обычно обработка событий выполняется, как говорит @mKorbel.Для многих классов прослушивателей событий существуют определенные методы, вызываемые для события.Это может привести ко многим анонимным внутренним классам.Поэтому EventHandler был представлен.Это более эффективно, используя отражение, и создает меньше объектов.См. http://docs.oracle.com/javase/7/docs/api/java/beans/EventHandler.html

Во-вторых, почему это пошло не так: я ожидал:

comboBox.addItemListener(ItemListener.class, textController, "doSomething");

Как сказал @mKorbel, из-за теста SELECTED лучше не использовать EventHandler здесь.

2 голосов
/ 19 декабря 2011

Для JComboBox лучше реализует ItemListener , но этот Listener всегда вызывается дважды SELECTED и DESELECTED, вы можете проверить, что если событие SELECTED/DESELECTED

   myComboBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                //some stuff
            }
        }
    });

Вы можете использовать ActionListener , но я предлагаю использовать это для изменения самих себя JComboBox's свойств или методов, а не для отвлечения от JComboBox, для того, чтобы где-то перейти к GUI

Вы можете использовать EventHandler , но лучше было бы начать опираться на базовые вещи до

0 голосов
/ 12 ноября 2013

В дополнение к данному ответу у меня были проблемы с кодом, сгенерированным Netbeans - который он скрывает на случай, если мы его сломаем !! В то время как Builder получает быструю настройку графического интерфейса - и для этого он отлично работает, у меня был сгенерирован ошибочный код события. Теперь у меня есть привычка не добавлять события с помощью Builder, но у меня есть «собственный письменный» метод для их настройки - особенно в этом случае, используя превосходный совет выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...