我看过很多使用 ActionListener
、ChangeListener
或者 ItemListener
的 Java Swing 程序。它们之间有什么区别,我应该在什么情况下使用它们?
ActionListener
它们用于按钮或菜单。每当您单击它们时,它会通知ActionEvent,然后调用actionPreformed(ActionEvent e)函数执行指定的任务。
ItemListeners
这些用于复选框、单选按钮、组合框等类型的控件。
请参阅此链接中使用ActionListener而不是item listener时在组合框中发生的情况https://coderanch.com/t/331788/java/add-listener-combo-drop-list。
ChangeListener
这用于像滑块、颜色选择器和微调器之类的组件,其中您希望根据该组件中的更改执行操作(https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html)。
请关注“更改”一词。然后您可能认为它也适用于按钮。您可以在此网站上自行查看http://www.java2s.com/Tutorial/Java/0240__Swing/AddchangelistenertoButtonmodel.htm
Action saveAction = new AbstractAction("Save") {
@Override
public void actionPerformed(ActionEvent event) {
saveDocument();
}
};
saveAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_S);
saveAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control S"));
saveMenuItem = new JMenuItem(saveAction);
Action showStatusAction = new AbstractAction("Show Status") {
@Override
public void actionPerformed(ActionEvent event) {
boolean selected = (Boolean) getValue(SELECTED_KEY);
statusBar.setVisible(selected);
}
};
showStatusAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_W);
showStatusAction.putValue(Action.SELECTED_KEY, true);
showStatusMenuItem = new JCheckBoxMenuItem(showStatusAction);
我的理解是,在标准的JMenuItem或按钮上使用ChangeListener没有任何意义,因为ChangeEvent主要用于向渲染器指示需要重新绘制组件。
setSelected()
不会触发 Action 的 actionPerformed
方法。(它们确实会更新 SELECTED_KEY
值,但是只有在触发 "状态更改" ItemEvent 之后才会进行更新。) 这是有道理的,因为 ActionEvent 旨在指示人类用户采取某种行动。但是如果以编程方式调用 setSelected
,请不要依赖 actionPerformed
来完成工作。 :-) - Ti Strga
ItemListener
的文档:似乎主要用于 ComboBox,尽管 Accessibility 接口似乎也在使用它。https://docs.oracle.com/javase/10/docs/api/java/awt/event/ItemListener.html - markspaceChangeListener
的使用要少得多。一个ChangeListener
用于查找对象的内部状态变化。通常这些都是你不必纠结的事件。https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html 基本上,ActionListner
是你的主力军,首先查看 Swing 组件的ActionListner
。 - markspaceJMenuBar
事件。 - Pika Supports Ukraine