【问题标题】:JCheckbox change listener gets notified of mouse over eventsJCheckbox 更改侦听器收到鼠标悬停事件的通知
【发布时间】:2010-11-21 02:57:29
【问题描述】:

有人可以向我解释为什么当您将鼠标移到复选框上时这段代码会打印到控制台吗?发生的“改变”事件是什么?

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)

并通知我的侦听器,而动作侦听器无法做到这一点。那么有没有办法禁用这个“鼠标悬停”事件或我可以实现我的监听器的另一种方式?

【问题讨论】:

  • 奇怪,我认为使用 setSelected 会触发更改侦听器。我一定在想别的事。
  • 如果我在 Mac OSX 上的 Java 5 上运行它,我不会将鼠标悬停在事件上。
  • @jeef3:setSelected 确实会触发更改事件。这就是我使用它的原因。问题是鼠标悬停也会触发更改事件:)
  • @banjollity: 看起来像是 windows-mac jvm 的区别...
  • 确实,在我的 Mac 上,当我将鼠标移到复选框上时,打印语句不会执行。我在下面看到一个关于将“翻转”设置为false 的答案以及关于监听不同事件的其他答案,但显然 Mac 和 Windows 上的默认设置之间存在一些差异。今天我遇到了这个差异,因为我的客户的计算机是 Windows,当他的光标移到一个复选框上时,我们的应用程序中发生了一些我没想到的事情..

标签: java events event-handling checkbox listener


【解决方案1】:

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

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

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

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

c.addItemListener(new ItemListener() {

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

【讨论】:

  • 感谢这项工作。我总是将项目侦听器应用于仅列出类似组件的列表。 :)
  • 没问题。它实际上是 ListSelectionListener 用于列表。列表和按钮有不同的界面,因为列表选择需要支持选择需要不同事件类型的单元格范围。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    复选框(甚至只是复选框模型)的状态会根据鼠标是否悬停在其上而发生变化。所以应该会发生状态变化事件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多