java - 如何使 itemStateChange 方法在按下 JButton 时运行?

标签 java swing events jbutton itemlistener

我正在向 JButton 添加 ItemListener,但方法未运行。 我在java API中读到,JButton可以通过addItemListener方法添加一个实现ItemEventListenr接口(interface)的对象。但是当按下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 方法。

最佳答案

当按下 JButton 时,

ItemListener 不会被触发。 (不完全确定) ItemListener 永远不会为 JButton 触发,除非您手动触发它。 JButton 提供 addItemListener 方法的原因是它从其父类 AbstractButton 实现了 ItemSelectable 继承。 AbstractButton 需要提供此方法,因为有很多组件类扩展它并且它们需要是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);
        });
    }
}

关于java - 如何使 itemStateChange 方法在按下 JButton 时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119276/

相关文章:

java - 调用被覆盖的基类的方法

java - 按下 "enter"键后添加到 JList

java - 倒计时器

java - Android - 添加屏幕并在其中滑动

java - 方法execute(Object[]) 对于类型WebTask 来说不明确?

java - 从java中的DataInputStream获取当前位置

java - Java中滚动后的矩形条

javascript - 事件未定义错误,仅在 Firefox 中

c# - 如何订阅从 C# 中的任何集合元素触发的事件?

c# - 如何在加载表单后执行代码?