Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing问题,为什么changeEvent会使用jButton触发额外的事件?_Java_Swing_Jbutton_Changelistener - Fatal编程技术网

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

Java Swing问题,为什么changeEvent会使用jButton触发额外的事件?,java,swing,jbutton,changelistener,Java,Swing,Jbutton,Changelistener,在尝试学习JButton事件时,我因为一个问题而感到困惑。我使用的示例代码是 代码如下: jb.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { System.out.println("Changed"); } }); 这是一个演示应用程序,因此只使用一个按钮,并且在应用程序启动时具有焦点。我只需按空格键来模拟

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

代码如下:

jb.addChangeListener(new ChangeListener() 
{
    @Override
    public void stateChanged(ChangeEvent e)
    {
        System.out.println("Changed");
    }
});
这是一个演示应用程序,因此只使用一个按钮,并且在应用程序启动时具有焦点。我只需按空格键来模拟单击事件。根据教程(由OReilly:JavaSwing编写),它应该触发更改事件两次,然后触发操作事件,然后触发操作事件。i、 e

  • 改变
  • 改变
  • 动作事件
  • 改变
  • 但在第四场比赛之后,我又得到了另一场比赛。按上述方式,一次单击实际上有5个事件。如果我尝试用鼠标点击,结果就更不一样了。当鼠标进入按钮区域时,将触发一个事件

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

    因此,我的问题是:

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

    编辑2: 教程指出

    根据L&F,还可能有其他变更事件


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

    按按钮时发生的五个事件依次为: ChangeEvent:Armed-true ChangeEvent:按下-为真 按钮事件 ChangeEvent:按下-错误 ChangeEvent:待命-错误

    如果您使用鼠标按下按钮,则除上述操作外,
    鼠标移动到按钮上方时,将出现一个用于滚动的ChangeEvent:true;鼠标离开按钮时,将出现另一个用于滚动的ChangeEvent:false。

    您是否正在尝试学习如何使用
    JButton
    或如何使用
    ChangeListener
    ?我问这个问题是因为在我编写Java代码的所有时间里,我从来没有找到向按钮添加
    ChangeListener
    的理由。一个
    ActionListener
    是通常的做法..同意安德鲁的观点。在任何情况下,我都会从Swing教程开始进行解释/示例。在您的情况下,选择按钮时会发生一个事件,取消选择按钮时会发生一个事件。@camickr挑剔:普通的JButton无法选择操作:ChangeEvents的确切数量很难预测:每当buttonModel的属性发生更改时(如启用、按下或鼠标触发时滚动),都会触发ChangeEvents@Jones不明白你的意思…不知道:在用户组件(按钮)上添加封面方法与否是设计决定,swing团队决定不为模型添加封面方法。原因可能是(当然,只是猜测)应用程序代码通常不需要模型属性,因此没有必要使api混乱