java - 试图理解这个在 Java 中使用 changeListener 的 swing 程序的输出?

标签 java swing jbutton actionlistener changelistener

我有来自 this link. 的以下代码.它使用 Swing 框架和一个简单的 ChangeListener 示例。

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class StateListener {

    public static void main(String args[]) {

  JFrame jFrame = new JFrame("");

  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  JButton button = new JButton("Press Me");

  ActionListener actionListner = new ActionListener() {

@Override

public void actionPerformed(ActionEvent event) {

    AbstractButton absButton = (AbstractButton) event.getSource();

    boolean selected = absButton.getModel().isSelected();

    System.out.println("Selected=" + selected + " \n");

}

  };

  ChangeListener changeListner = new ChangeListener() {

@Override

public void stateChanged(ChangeEvent event) {

    AbstractButton aButton = (AbstractButton) event.getSource();

    ButtonModel aModel = aButton.getModel();

    boolean armed = aModel.isArmed();

    boolean pressed = aModel.isPressed();

    boolean selected = aModel.isSelected();

    System.out.println("Armed :" + armed + " - Pressed :" + pressed + " - Selected :" + selected);

}

  };

  button.addActionListener(actionListner);

  button.addChangeListener(changeListner);

  Container cPane = jFrame.getContentPane();

  cPane.add(button, BorderLayout.CENTER);

  jFrame.setSize(800, 500);

  jFrame.setVisible(true);
    }
}

我的问题是: 1) 当我点击 Press Me 时,输出是

Armed :true - Pressed :false - Selected :false
Armed :true - Pressed :true - Selected :false
Selected=false 

Armed :true - Pressed :false - Selected :false
Armed :false - Pressed :false - Selected :false

我在第 61 行和第 63 行只有两次调用 Listener

button.addActionListener(actionListner);

  button.addChangeListener(changeListner);

输出应该是

Selected=false 

    Armed :true - Pressed :false - Selected :false

但是我得到了 4 行输出,我无法理解

2). addActionListeneraddChangeListener 方法是否是 JButton 类的一部分,因为它们没有被 ChangeListener 或 ActionListener 覆盖?

谢谢,我是 Swing Framework 的新手。非常感谢任何帮助。

最佳答案

当在按钮上接收到 mousePressed 事件时,将执行以下代码:

if (!model.isArmed()) 
{
    model.setArmed(true);
}
model.setPressed(true);

每次模型状态发生变化时,都会生成一个 ChangeEvent,您会收到两个事件。

同样在鼠标上发布:

model.setPressed(false);
model.setArmed(false);

所以每个MouseEvent都会产生多个ChangeEvents。

Are the methods, addActionListener and addChangeListener part of JButton

阅读 API 文档。它会告诉您在哪个类中定义了这些方法。

The output should be

输出顺序不依赖于您将监听器添加到组件的顺序。在按下并释放鼠标或按下并释放空格键之前,不会生成 ActionEvent。

关于java - 试图理解这个在 Java 中使用 changeListener 的 swing 程序的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18704128/

相关文章:

java - 将谷歌地图与java swing应用程序一起使用?

java - setInputVerifier(InputVerifier inputVerifier) 如何工作?

java - 单击按钮后 KeyListener 不起作用

java - 单击鼠标交换按钮图标

java - java swing中的定位

java - 我怎样才能让这个自定义 JButton 工作?

java - 如何在 Spring Controller 方法中从许多 @RequestParam 参数切换到 @ModelAttribute

java - 如何在 spring 的 bean 属性值中包含 < 或 > 字符?

java - SwipeRefreshLayout 以编程方式触发

Java 8 Lambda 创建一个映射,其中值是列表的包装对象