ItemListener vs ChangeListener vs ActionListener

Pik*_*les 5 java swing

我见过许多使用ActionListenerChangeListener或 的Java Swing 程序ItemListener。它们之间有什么区别?我应该何时使用它们?

Sta*_*der 6

ActionListener
它们与按钮或菜单一起使用。这样,每当您单击它们时,它都会通知 ActionEvent,而 ActionEvent 又会调用 actionPreformed(ActionEvent e) 函数来执行指定的任务。

项目监听器
这些与复选框、单选按钮、组合框之类的东西一起使用。在此链接https://coderanch.com/t/331788/java/add-listener-combo-drop-list
中查看当您将 ActionListener 与组合框而不是项目侦听器一起使用时会发生什么。

ChangeListener
这与滑块、颜色选择器和微调器等组件一起使用,您希望根据该组件中的更改执行操作(https://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html)。
重点是“变”字。那么您可能会认为它也应该适用于按钮。您可以在这个网站上亲自查看 http://www.java2s.com/Tutorial/Java/0240__Swing/AddchangelistenertoButtonmodel.htm


VGR*_*VGR 2

对于 JMenuItem,您应该使用Action(这是 ActionListener 的更强大的形式),而不是侦听器:

\n\n
Action saveAction = new AbstractAction("Save") {\n    @Override\n    public void actionPerformed(ActionEvent event) {\n        saveDocument();\n    }\n};\nsaveAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_S);\nsaveAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control S"));\n\nsaveMenuItem = new JMenuItem(saveAction);\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 JCheckBoxMenuItems 和 JRadioButtonMenuItems,与常规 JMenuItems 一样,当用户激活菜单项时,将调用 Action\xe2\x80\x99s actionPerformed 方法。您可以在操作中检查新状态:

\n\n
Action showStatusAction = new AbstractAction("Show Status") {\n    @Override\n    public void actionPerformed(ActionEvent event) {\n        boolean selected = (Boolean) getValue(SELECTED_KEY);\n        statusBar.setVisible(selected);\n    }\n};\nshowStatusAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_W);\nshowStatusAction.putValue(Action.SELECTED_KEY, true);\n\nshowStatusMenuItem = new JCheckBoxMenuItem(showStatusAction);\n
Run Code Online (Sandbox Code Playgroud)\n\n

true请注意,Action.SELECTED_KEY 仅在您将其设置为或false在安装 Action 之前才有效。从文档中中:

\n\n
\n

遵循此属性的组件仅在该值非空时才使用该值。例如,如果您SELECTED_KEY在 a 上设置一个具有空值的操作JToggleButton,则JToggleButton不会以任何方式更新其选定状态。类似地,任何时候JToggleButton\ 的选定状态发生更改时,如果操作具有非空值,则只会将值设置回操作上SELECTED_KEY

\n
\n\n

如果您坚持直接使用侦听器,则 ItemListener 指示选择状态,因此可以使用它来监视 JCheckBoxMenuItems 和 JRadioButtonMenuItems 的状态。对于所有其他 JMenuItem,请使用 ActionListener。

\n\n

以上实际上适用于AbstractButton的所有后代以及 JMenuItem 及其后代类的所有后代:

\n\n
    \n
  • 对于 JButton,请使用操作。
  • \n
  • 对于 JToggleButtons、JCheckBoxes 和 JRadioButtons,使用 Action 并检查其 SELECTED_KEY 值。
  • \n
  • 如果您不愿意使用 Actions,请对 JButtons 使用 ActionListener,对 JToggleButtons、JCheckBoxes 和 JRadioButtons 使用 ItemListener。
  • \n
\n\n

我的理解是,没有理由将 ChangeListener 与标准 JMenuItem 或按钮一起使用,因为 ChangeEvent 主要是为了向渲染器指示该组件需要重新绘制。

\n