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

时间:2013-09-07 13:59:06

标签: 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. 的ActionEvent
  4. 改变
  5. 但是在第4次事件之后我得到了另一个ChangeEvent。以上述方式实际上只有一次点击就有5个事件。如果我试图用鼠标点击,结果会更加不同。当鼠标进入按钮区域时,会触发一个事件。

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

    所以我的问题是:

    1. 为什么我会看到ChangeEvent两次应该是哪一个?
    2. 如何在JButton中找到更改状态?
    3. 编辑: 我看到DefaultButtonModel中提到了5个状态,它们是在ButtonModel接口中定义的。但JButton没有字段,方法来获得这些状态。他们是否愿意被忽视?或者JButton(和AbstractButton)与ButtonModel接口无关。

      编辑2: 教程指出,

        

      根据L& F,可能还有其他ChangeEvents。

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

1 个答案:

答案 0 :(得分:2)

按顺序按钮时发生的五个事件是: ChangeEvent:武装 - 真的 ChangeEvent:按下 - 是的 动作事件 ChangeEvent:按下 - 假 ChangeEvent:武装 - 假

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