Java ItemListener vs ChangeListener vs ActionListener
我见过许多Java Swing程序使用Java ItemListener vs ChangeListener vs ActionListener,java,swing,Java,Swing,我见过许多Java Swing程序使用ActionListener、ChangeListener或ItemListener。它们之间有什么区别?我应该在什么时候使用它们?ActionListener 它们与按钮或菜单一起使用。因此,无论何时单击它们,它都会通知ActionEvent,而ActionEvent又会调用actionPreformed(ActionEvent e)函数来执行指定的任务。 项目监听器 它们与复选框、单选按钮、组合框等一起使用。 查看在该链接中使用带有组合框的ActionL
ActionListener
、ChangeListener
或ItemListener
。它们之间有什么区别?我应该在什么时候使用它们?ActionListener它们与按钮或菜单一起使用。因此,无论何时单击它们,它都会通知ActionEvent,而ActionEvent又会调用actionPreformed(ActionEvent e)函数来执行指定的任务。
项目监听器
它们与复选框、单选按钮、组合框等一起使用。
查看在该链接中使用带有组合框的ActionListener而不是item listener时会发生什么 ChangeListener
这用于滑块、颜色选择器和微调器等组件,您希望根据该组件中的更改执行操作()<关注“改变”这个词。那么你可能会认为它也应该和按钮一起工作。您可以在本网站上亲自查看对于JMenuItem,您应该使用(这是一种更有效的ActionListener形式),而不是侦听器: 对于JCheckBoxMenuItems和JRadioButtonMenuItems,与常规JMenuItems一样,当用户激活菜单项时,将调用操作的actionPerformed方法。您可以从操作中检查新状态:
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);
请注意,Action.SELECTED_键仅在安装Action之前将其设置为true
或false
时有效。从:
符合此属性的组件仅在值非null时使用该值。例如,如果在JToggleButton
上为SELECTED_KEY
设置了空值的操作,则JToggleButton
将不会以任何方式更新其所选状态。类似地,任何时候JToggleButton
的选定状态发生变化时,只有当该操作的选定键的值为非空时,才会将该值设置回该操作
如果坚持直接使用侦听器,ItemListener将指示选择状态,因此可以使用它监视JCheckBoxMenuItems和JRadioButtonMenuItems的状态。对于所有其他JMenuItems,请使用ActionListener
上述内容实际上适用于的所有子体以及JMenuItem及其子体类:
- 对于JButtons,使用操作
- 对于JToggleButtons、jCheckBox和JRadioButtons,使用动作并检查其选中的_键值
- 如果您不愿意使用操作,请将ActionListener用于JButtons,并将ItemListener用于JToggleButtons、JCheckBox和JRadioButtons
我的理解是,没有理由使用带有标准JMenuItem或按钮的ChangeListener,因为ChangeEvent主要用于向呈现器指示组件需要重新绘制。查看ItemListener的文档:看起来像是组合框,尽管易访问性界面似乎也在使用它。ActionListener文档:几乎所有内容,但主要是按钮。Swing-like菜单中的许多组件实际上都是按钮,因此它被大量使用。我从经验中知道,ChangeListener
的使用要少得多。更改侦听器查找对象的内部状态更改。通常,这些都是你不必处理的事情。基本上,ActionListner
是你的谋生之道,首先看看Swing组件。你问题的背景是什么?您正在编写自己的组件类吗?@VGR目前,我正在创建一个简单的gui,我需要监听JMenuBar
事件。新的编码人员注意,在JToggleButton/JCheckBox/JRadioButton情况下,调用setSelected()
不会触发操作的actionPerformed
方法。(它们确实会更新SELECTED_KEY
值,但只有在触发“state change”ItemEvent之后才会更新。)这是有意义的,因为ActionEvent表示人类用户正在采取某种行动。但如果以编程方式调用setSelected
,则不要依赖actionPerformed
来完成工作。:-)
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);