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

Java JCheckbox更改侦听器收到鼠标悬停事件的通知,java,events,event-handling,checkbox,listener,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[] ar

有人能给我解释一下,当你把鼠标移到复选框上时,为什么这段代码会打印到控制台上?发生的“变化”事件是什么

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)

并通知我的侦听器,这是动作侦听器无法完成的。那么,有没有一种方法可以禁用此“鼠标悬停”事件,或者有其他方法可以实现我的侦听器?

复选框的状态(甚至只是复选框模型)会根据是否有鼠标悬停而变化。因此,状态更改事件应该是可以预料的


因此,只需返回查看复选框处于什么状态,并相应地进行更新。最好直接使用模型,而不是使用“臃肿”的组件界面。

当焦点获得/丢失表示组件状态的更改时,鼠标悬停时会出现事件

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

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

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

c.addItemListener(new ItemListener() {

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

使用
c.setRolloverEnabled(false
)`您将不会获得任何鼠标运动事件。

奇怪的是,我认为使用
setSelected
将触发更改侦听器。我一定在想别的事情。如果我在Mac OSX上的Java 5上运行它,我不会将鼠标移到事件上。@jeef3:setSelected会触发更改事件。这就是我使用它的原因。问题是,更改事件也会由鼠标移动触发:)@Banjolly:看起来像是windows mac jvm的差异……事实上,在我的mac上,当我将鼠标移到复选框上时,print语句不会执行。我在下面看到了一个关于将“滚动”设置为
false
的答案,以及其他关于监听不同事件的答案,但显然Mac和Windows上的默认设置之间存在一些差异。今天我遇到了这种差异,因为我的客户的计算机是Windows,我们的应用程序中发生了一些事情,当他的光标移动到复选框上时,我没有预料到。谢谢,这很有效。我始终认为项目侦听器仅应用于类似列表的组件。:)没问题。实际上是ListSelectionListener用于列表。列表和按钮有不同的界面,因为列表选择需要支持选择需要不同事件类型的单元格范围。