How to make itemStateChange method to run when JButton is pressed?

704 Views Asked by At

I'm adding an ItemListener to JButton but method doesn't run. I read in java API that a JButton can add an object that implements ItemEventListenr interface by addItemListener method.But when pressing on the JButton only actionPerform method runs.I also tried to call

JButton.setSelected(true) 

but it didn't make a change.

JFrame frame = new JFrame();
plainJButton = new JButton( "Plain Button" );
plainJButton.setSelected(true);
ButtonHandler handler = new ButtonHandler();
ButtonItemHandler itemHandler = new ButtonItemHandler();
plainJButton.addActionListener(handler );
plainJButton.addItemListener( itemHandler );
frame.add( plainJButton ); // add plainJButton to JFrame 

// inner class for button event handling
private class ButtonHandler implements ActionListener 
   {
      // handle button event
      public void actionPerformed( ActionEvent event )
      {
         JOptionPane.showMessageDialog( ButtonFrame.this, String.format(
            "You pressed: %s", event.getActionCommand() ) );
      } // end method actionPerformed
   } // end private inner class ButtonHandler 


 // inner class for button event handling

   private class ButtonItemHandler implements ItemListener
   {
       public void itemStateChanged(ItemEvent e)
       {
           System.out.println(e.getStateChange()+"\n");
           System.out.println(plainJButton.isSelected() +"\n");
       }
   }
} // end class ButtonFrame

I expect itemStateChange method will be run but only actionPerformed method runs.

1

There are 1 best solutions below

0
George Z. On

ItemListener will not be fired when a JButton is pressed. (Without being completely sure) ItemListener will never be fired for a JButton, unless you fire it manually. The reason a JButton provides an addItemListener method is because it inherits it from its parent class AbstractButton implements ItemSelectable. AbstractButton needs to provide this method since there are a lot of component classes that extend it and they need to be ItemSelectables. For example, take a look at JRadioButton extends AbstractButton. When you select/deselect a JRadioButton its ItemListener will fire normally.

You can always test it yourself and see that every time you click the radio button the listener will be fired.

public class ButtonItemListener {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("button");
            frame.setLayout(new FlowLayout());
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            JButton jButton = new JButton("JBUTTON");
            jButton.addItemListener(e -> System.out.println("JBUTTON"));

            JRadioButton radioButton = new JRadioButton("RADIOBUTTON");
            radioButton.addItemListener(e -> System.out.println("RADIOBUTTON"));

            frame.add(jButton);
            frame.add(radioButton);

            frame.setSize(400, 400);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}