Слушатель изменений JCheckbox получает уведомление о наведении курсора мыши на события

Может кто-нибудь объяснить мне, почему этот фрагмент кода выводится на консоль, когда вы наводите указатель мыши на флажок? Какое событие «изменения» происходит?

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        JCheckBox c = new JCheckBox("Print HELLO");
        c.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("HELLO");
            }
        });
        f.getContentPane().add(c);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

}

ПРИМЕЧАНИЕ. Я не использую прослушиватель действий, потому что в своей программе я хочу иметь возможность делать:

checkBox.setSelected(boolean)

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


person Savvas Dalkitsis    schedule 19.08.2009    source источник
comment
Странно, я думал, что использование setSelected вызовет прослушивание изменений. Я должен думать о чем-то другом.   -  person jeef3    schedule 20.08.2009
comment
Если я запускаю это на Java 5 в Mac OSX, я не получаю мышь над событиями.   -  person banjollity    schedule 20.08.2009
comment
@jeef3: setSelected Инициирует события изменения. Вот почему я использую его. Дело в том, что события изменения также запускаются при наведении мыши на движения :)   -  person Savvas Dalkitsis    schedule 20.08.2009
comment
@banjollity: похоже на разницу jvm между windows и mac...   -  person Savvas Dalkitsis    schedule 20.08.2009
comment
Действительно, на моем Mac оператор печати не выполняется, когда я навожу указатель мыши на флажок. Ниже я вижу ответ о настройке ролловера на false и другие ответы о прослушивании различных событий, но очевидно, что здесь есть некоторая разница между значениями по умолчанию для Mac и Windows. Сегодня я столкнулся с этой разницей, потому что компьютер моего клиента - Windows, и в нашем приложении произошло что-то, чего я не ожидал, когда его курсор переместился на флажок.   -  person Jason    schedule 28.09.2020


Ответы (3)


Вы получаете события при наведении указателя мыши, поскольку получение/потеря фокуса представляет собой изменение состояния компонента.

Вместо этого вы можете использовать ItemListener, который даст вам ItemEvents.

Объект, реализующий интерфейс ItemListener, получает это ItemEvent при возникновении события. Слушатель избавлен от деталей обработки отдельных движений мыши и щелчков мыши и вместо этого может обрабатывать «значащие» (семантические) события, такие как «элемент выбран» или «элемент отменен».

Вы можете добавить его в свой флажок с помощью метода addItemListener() в классе AbstractButton. Просто замените addChangeListener на это:

c.addItemListener(new ItemListener() {

    public void itemStateChanged(ItemEvent e) {
        System.err.println(e.getStateChange());
    }
});
person Aaron    schedule 19.08.2009
comment
Спасибо, это работает. Я всегда использовал прослушиватели элементов только для списка похожих компонентов. :) - person Savvas Dalkitsis; 20.08.2009
comment
Без проблем. На самом деле это ListSelectionListener, который используется для списков. Существует другой интерфейс для списков и кнопок, поскольку выбор списка должен поддерживать выбор диапазона ячеек, для которого требуется другой тип события. - person Aaron; 20.08.2009

Используйте c.setRolloverEnabled(false)`, и вы не получите никаких событий для движений мыши.

person Fredrik    schedule 02.04.2013

Состояние флажка (даже просто модель флажка) меняется в зависимости от того, наведен на него указатель мыши или нет. Таким образом, следует ожидать события изменения состояния.

Итак, просто вернитесь, чтобы увидеть, в каком состоянии находится флажок, и обновите его соответствующим образом. Лучше сразу перейти к модели, а не использовать «раздутый» интерфейс компонента.

person Tom Hawtin - tackline    schedule 19.08.2009