JCheckbox更改侦听器会收到有关鼠标悬停事件的通知

时间:2009-08-19 21:28:56

标签: java events event-handling checkbox listener

有人可以向我解释为什么当你将鼠标移到复选框上时,这段代码打印到控制台?发生了什么“变化”事件?

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 个答案:

答案 0 :(得分:31)

鼠标悬停时会发生事件,因为焦点获得/丢失表示组件状态发生变化。

相反,您可以使用ItemListener,它将为您提供ItemEvents。

  

实现ItemListener接口的对象在事件发生时获取此ItemEvent。听众可以省去处理单个鼠标移动和鼠标点击的细节,而是可以处理“有意义的”(语义)事件,例如“选择项目”或“取消选择项目”。

您可以使用AbstractButton类中的addItemListener()方法将其添加到复选框中。只需将addChangeListener替换为:

c.addItemListener(new ItemListener() {

    public void itemStateChanged(ItemEvent e) {
        System.err.println(e.getStateChange());
    }
});

答案 1 :(得分:6)

使用c.setRolloverEnabled(false)`你不会得到鼠标动作的任何事件。

答案 2 :(得分:1)

复选框的状态(甚至只是复选框模型)会根据鼠标是否覆盖而改变。所以应该期待一个状态变化事件。

因此,只需检查一下复选框所处的状态并进行相应更新。最好直接使用模型,而不是使用“膨胀”组件接口。