trying to understand the output of this swing program that uses changeListener in Java?

295 views Asked by At

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.

2

There are 2 answers

4
camickr On BEST ANSWER

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.

0
mKorbel On
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