当按下JButton时,如何使itemStateChange方法运行?

时间:2019-07-19 20:29:25

标签: java swing events jbutton itemlistener

我正在向JButton添加ItemListener,但是方法无法运行。 我在Java API中读到一个JButton可以通过addItemListener方法添加一个实现ItemEventListenr接口的对象。但是,当按下JButton时,只有actionPerform方法运行。我还尝试调用

JButton.setSelected(true) 

但没有做任何改变。

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

我希望itemStateChange方法可以运行,但是只有actionPerformed方法可以运行。

1 个答案:

答案 0 :(得分:0)

按下ItemListener时不会触发

JButton。 (无需完全确定)ItemListener永远不会为JButton触发,除非您手动将其触发。 JButton提供addItemListener方法的原因是因为它从其父类AbstractButton implements ItemSelectable继承了该方法。 AbstractButton需要提供此方法,因为extend有很多组件类,它们必须是ItemSelectable。例如,看一下JRadioButton extends AbstractButton。选择/取消选择一个JRadioButton时,其ItemListener将正常触发。

您始终可以自己对其进行测试,并看到每次单击单选按钮都会触发监听器。

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);
        });
    }
}