Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ItemListener vs ChangeListener vs ActionListener_Java_Swing - Fatal编程技术网

Java ItemListener vs ChangeListener vs ActionListener

Java ItemListener vs ChangeListener vs ActionListener,java,swing,Java,Swing,我见过许多Java Swing程序使用ActionListener、ChangeListener或ItemListener。它们之间有什么区别?我应该在什么时候使用它们?ActionListener 它们与按钮或菜单一起使用。因此,无论何时单击它们,它都会通知ActionEvent,而ActionEvent又会调用actionPreformed(ActionEvent e)函数来执行指定的任务。 项目监听器 它们与复选框、单选按钮、组合框等一起使用。 查看在该链接中使用带有组合框的ActionL

我见过许多Java Swing程序使用
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);