我正在向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方法可以运行。
答案 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);
});
}
}