Reputation: 31252
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.
Upvotes: 1
Views: 278
Reputation: 324128
When a mousePressed event is received on a button the following code is executed:
if (!model.isArmed())
{
model.setArmed(true);
}
model.setPressed(true);
Every time the state of the model is changed a ChangeEvent is generated to you get two events.
Same on a mouseReleased:
model.setPressed(false);
model.setArmed(false);
So each MouseEvent will generate multiple ChangeEvents.
Are the methods, addActionListener and addChangeListener part of JButton
Read the API documentation. It will tell you in which class the methods are defined.
The output should be
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.
Upvotes: 3
Reputation: 109813
boolean selected = absButton.getModel().isSelected();
should be only
boolean selected = absButton.getModel().isPressed();
only ChangeListener
can firing an events from ButtonModel
and its Mouse
and Key Events
implemented in XxxButtonUI
,
isArmed();
isPressed();
isSelected();
isRollover()
ActionListener
is fired from mouseClicked
and ENTER
and SPACE
Key Events, those KeyBindings
are implemented in JButtons API
Upvotes: 2