I have the following code from this link.. It uses Swing framework and a simple ChangeListener example.
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);
}
}
my questions are :
1) when I click the Press Me
, the output is
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
I have only two calls to Listener
at lines 61 and 63 which are.
button.addActionListener(actionListner);
button.addChangeListener(changeListner);
The output should be
Selected=false
Armed :true - Pressed :false - Selected :false
but I am getting 4 lines of output, which I am unable to understand
2). Are the methods, addActionListener
and addChangeListener
part of JButton
Class since they are not overridden by ChangeListener or ActionListener?
Thanks, I am a newbie to using Swing Framework. Any help is much appreciated.
When a mousePressed event is received on a button the following code is executed:
Every time the state of the model is changed a ChangeEvent is generated to you get two events.
Same on a mouseReleased:
So each MouseEvent will generate multiple ChangeEvents.
Read the API documentation. It will tell you in which class the methods are defined.
The order of output is not dependent on the order in which you add the listeners to the component. The ActionEvent will not be generated until the mouse have been pressed and released or the spacebar has been pressed and released.