Слушатель изменения JCheckbox получает уведомление о событиях при наведении курсора мыши - PullRequest
9 голосов
/ 20 августа 2009

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

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)

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

Ответы [ 3 ]

31 голосов
/ 20 августа 2009

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

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

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

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

c.addItemListener(new ItemListener() {

    public void itemStateChanged(ItemEvent e) {
        System.err.println(e.getStateChange());
    }
});
6 голосов
/ 02 апреля 2013

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

1 голос
/ 20 августа 2009

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

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

...