0

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

代码如下:

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

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

  1. 改变了
  2. 改变了
  3. 动作事件
  4. 改变了

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

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

所以我的问题是:

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

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

编辑2:教程表明,

根据 L&F,可能还会有额外的 ChangeEvents。

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

4

1 回答 1

2

当您按下按钮时发生的五个事件依次是: ChangeEvent: Armed - true ChangeEvent: Pressed - true ActionEvent ChangeEvent: Pressed - false ChangeEvent: Armed - false

如果您使用鼠标按下按钮,那么除了上述之外,还会有一个 ChangeEvent for Rollover:当鼠标移到按钮上时为 true,另一个 for Rollever:当鼠标离开按钮时为 false。

于 2015-01-21T21:41:02.963 回答