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

时间:2013-09-09 17:55:26

标签: 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)。方法addActionListeneraddChangeListenerJButton类的一部分,因为它们没有被ChangeListener或ActionListener覆盖吗?

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

2 个答案:

答案 0 :(得分:3)

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

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

每次更改模型的状态时,都会生成ChangeEvent以获得两个事件。

鼠标相同发布:

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

因此每个MouseEvent都会生成多个ChangeEvents。

  

是方法,addActionListener和addChangeListener是JButton的一部分

阅读API文档。它将告诉您方法定义在哪个类中。

  

输出应为

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

答案 1 :(得分:2)

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

应该只是

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

只有ChangeListener可以触发ButtonModel及其MouseKey EventsXxxButtonUI实施的事件,

isArmed();
isPressed();
isSelected();
isRollover() 

ActionListener来自mouseClicked以及ENTERSPACE个关键事件,这些KeyBindings在JButtons API中实现