Java Swing 问题,为什么changeEvent 使用jButton 触发额外的事件?

标签 java swing jbutton changelistener

在尝试学习 JButton 事件时,我因一个问题而感到困惑。我正在使用的示例代码是 here

代码如下:

jb.addChangeListener(new ChangeListener() 
{
    @Override
    public void stateChanged(ChangeEvent e)
    {
        System.out.println("Changed");
    }
});

这是一个演示应用程序,因此仅使用一个按钮,并且在应用程序启动时它具有焦点。我只需按空格键来模拟单击事件。根据教程(OReilly:Java Swing),它应该触发更改事件两次,然后触发操作事件,然后触发操作事件。即

  1. 已更改
  2. 已更改
  3. Action 事件
  4. 已更改

但是在第四个事件之后我又收到了另一个 ChangeEvent。按照上面的方式,一次点击实际上有5个事件。如果我尝试用鼠标单击,结果会更加不同。当鼠标进入按钮区域时,会触发一个事件。

我不知道当鼠标悬停在 JButton 上时会发生什么变化并且引发 ChangeEvent。我没有找到类似于 getChangedState (ItemStageChanged) 的方法让 JButton 知道该按钮的状态发生了变化。既然是学习,除非我理解这个问题,否则我不想使用ActionListener。

所以我的问题是:

  1. 为什么我在应该是 1 次的地方却看到了两次 ChangeEvent?
  2. 如何查找 JButton 中更改的状态?

编辑: 我看到 DefaultButtonModel 中提到了 5 个状态,它们是在 ButtonModel 接口(interface)中定义的。但 JButton 没有获取这些状态的字段和方法。他们是自愿被忽视的吗?或者JButton(和AbstractButton)与ButtonModel接口(interface)无关。

编辑2: 教程指出,

Depending on the L&F, there may also be additional ChangeEvents.

我在 Windows 中使用 Swing 的默认 L&F,但得到的结果与教程的预期不同。

最佳答案

按下按钮时发生的五个事件按顺序是: ChangeEvent:武装 - true ChangeEvent:按下 - true Action 事件 ChangeEvent:按下 - false ChangeEvent:武装 - false

如果您使用鼠标按下按钮,那么除了上述之外, 当鼠标移到按钮上时,将有一个 ChangeEvent for Rollover: true ;当鼠标移开按钮时,将有另一个 Rollover: false 事件。

关于Java Swing 问题,为什么changeEvent 使用jButton 触发额外的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674065/

相关文章:

java - 如何使用鼠标事件切换图像?

java - 试图从 eclipse 启动 tomcat,但找不到 index.jsp

javascript - 如何在 onCall() 函数中抛出 HttpsError 并在 Android 客户端上捕获

java - 防止 JAXB XML 解析上的循环引用

java - JFrame 调整大小

java - JList高亮行问题

JavaFX 文本粘贴在其自身之上

java - 我的图像文件必须位于哪里才能使以下代码正常工作?

java - 添加下划线后如何阻止 JButton 的高度发生变化?

java - JButton() 仅在鼠标悬停时起作用