ItemListener与ChangeListener与ActionListener

时间:2018-11-02 17:49:59

标签: java swing

我已经看到许多使用ActionListenerChangeListenerItemListener的Java Swing程序。这些之间有什么区别,何时应分别使用?

2 个答案:

答案 0 :(得分:3)

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

ItemListeners
这些用于复选框,单选按钮,组合框之类的东西。
在此链接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

上亲自查看

答案 1 :(得分:1)

对于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);

对于JCheckBoxMenuItems和JRadioButtonMenuItems,就像常规的JMenuItems一样,当用户激活菜单项时,将调用Action的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之前将Action.SELECTED_KEY设置为truefalse才能起作用。来自documentation

  

使用此属性的组件仅在其值为非null时才使用该值。例如,如果您在SELECTED_KEY上将JToggleButton的Action设置为空值,则JToggleButton将不会以任何方式更新其选定状态。同样,JToggleButton的选定状态每次更改时,只会在操作具有SELECTED_KEY的非空值的情况下,才将值重新设置到操作上。

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

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

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

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