我有来自 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). addActionListener
和 addChangeListener
方法是否是 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/