ActionListener和ItemListener均用于通过JCheckBox触发事件?
所以,它们之间有什么区别,在这种情况下,其中一个优先于另一个?
ActionListener和ItemListener均用于通过JCheckBox触发事件?那么,它们之间有什么区别,在这种情况下,其中一个比另一个更受青睐?
ItemListener
和ActionListener
都相同,如果JCheckBox
具有相同的行为。但是,主要区别是可以通过调用复选框上的ItemListener
来触发setSelected(true)
。作为编码实践,请勿同时将ItemListener
和ActionListener
都注册到JCheckBox
,以避免不一致。
不同之处在于,对ActionEvent
执行操作时会触发JCheckBox
,其状态是通过使用鼠标,空格键或助记符单击来更改其状态。无论是否选择JCheckBox
,它都不会really
供参考,这里是ButtonGroup
,说明了区别。控制台:
我为JButton使用import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/q/9882845/230513 */
public class Listeners {
private void display() {
JFrame f = new JFrame("Listeners");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JCheckBox b = new JCheckBox("JCheckBox");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getID() == ActionEvent.ACTION_PERFORMED
? "ACTION_PERFORMED" : e.getID());
}
});
b.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
System.out.println(e.getStateChange() == ItemEvent.SELECTED
? "SELECTED" : "DESELECTED");
}
});
JPanel p = new JPanel();
p.add(b);
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Listeners().display();
}
});
}
}
,而addActionListener
对于addItemListener
更方便。在后一种情况下,我与JToggleButton
一起添加了每当JToggleButton被选中/未选中时的事件。
我一直在自己进行测试,并查看了这篇文章中的所有答案,但我认为他们回答的问题不是很好。为了获得一个好的答案,我进行了实验(下面的代码)。当单选按钮或复选框中的状态发生更改时,您可以100%的时间同时使用ActionListener和ItemListener触发任何一个事件,或者我假定的其他任何类型的Swing项目(因为它是Object类型)都将其触发。我可以告诉这两个侦听器的唯一区别是,随侦听器返回的事件对象的类型不同。并且您可以通过使用ItemListener而不是ActionListener的复选框获得更好的事件类型。