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用于列表。列表和按钮有不同的界面,因为列表选择需要支持选择需要不同事件类型的单元格范围。