ItemListener与ChangeListener与ActionListener的区别

5

我看过很多使用 ActionListenerChangeListener 或者 ItemListener 的 Java Swing 程序。它们之间有什么区别,我应该在什么情况下使用它们?


1
查看 ItemListener 的文档:似乎主要用于 ComboBox,尽管 Accessibility 接口似乎也在使用它。https://docs.oracle.com/javase/10/docs/api/java/awt/event/ItemListener.html - markspace
1
ActionListener的文档:几乎所有内容,但主要是按钮。Swing中的许多组件(如菜单)实际上都是按钮,因此它被广泛使用。https://docs.oracle.com/javase/10/docs/api/java/awt/event/ActionListener.html - markspace
1
我从经验中知道,ChangeListener 的使用要少得多。一个 ChangeListener 用于查找对象的内部状态变化。通常这些都是你不必纠结的事件。https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html 基本上,ActionListner 是你的主力军,首先查看 Swing 组件的 ActionListner - markspace
你的问题背景是什么?你正在编写自己的组件类吗? - VGR
@VGR 目前,我正在创建一个简单的 GUI,并且需要监听 JMenuBar 事件。 - Pika Supports Ukraine
2个回答

6

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


2
对于JMenuItem,你应该使用一个Action(它是一种更强大的ActionListener形式),而不是一个监听器:
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);

对于 JCheckBoxMenuItem 和 JRadioButtonMenuItem,与普通的 JMenuItem 一样,在用户激活菜单项时会调用 Action 的 actionPerformed 方法。您可以在您的 Action 中检查新状态:
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_KEY设置为true或false时,它才起作用。来自文档
引用: 组件只有在该属性的值非空时才使用它。例如,如果您在JToggleButton上设置了一个具有null值的SELECTED_KEY的Action,则JToggleButton不会以任何方式更新其选定状态。同样,在JToggleButton的选定状态更改时,它仅在Action具有非空SELECTED_KEY值时将值设置回该Action。
如果坚持直接使用侦听器,则ItemListener指示选择状态,因此可以用它来监视JCheckBoxMenuItems和JRadioButtonMenuItems的状态。对于所有其他JMenuItems,请使用ActionListener。
以上内容实际上适用于AbstractButton的所有后代以及JMenuItem及其派生类:
  • 对于JButtons,请使用Action。
  • 对于JToggleButtons、JCheckBoxes和JRadioButtons,请使用Action并检查其SELECTED_KEY值。
  • 如果您不想使用Actions,则对于JButtons,请使用ActionListener,对于JToggleButtons、JCheckBoxes和JRadioButtons,请使用ItemListener。

我的理解是,在标准的JMenuItem或按钮上使用ChangeListener没有任何意义,因为ChangeEvent主要用于向渲染器指示需要重新绘制组件。


新手编程人员请注意,在 JToggleButton/JCheckBox/JRadioButton 的情况下,调用 setSelected() 不会触发 Action 的 actionPerformed 方法。(它们确实会更新 SELECTED_KEY 值,但是只有在触发 "状态更改" ItemEvent 之后才会进行更新。) 这是有道理的,因为 ActionEvent 旨在指示人类用户采取某种行动。但是如果以编程方式调用 setSelected,请不要依赖 actionPerformed 来完成工作。 :-) - Ti Strga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接