有人可以向我解释为什么当你将鼠标移到复选框上时,这段代码打印到控制台?发生了什么“变化”事件?
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)
并通知我的侦听器,这不能通过动作侦听器完成。那么有没有办法禁用这个“鼠标悬停”事件或我可以实现我的听众的其他方式?
答案 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)
复选框的状态(甚至只是复选框模型)会根据鼠标是否覆盖而改变。所以应该期待一个状态变化事件。
因此,只需检查一下复选框所处的状态并进行相应更新。最好直接使用模型,而不是使用“膨胀”组件接口。