我已经看到许多使用ActionListener
,ChangeListener
或ItemListener
的Java Swing程序。这些之间有什么区别,何时应分别使用?
答案 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设置为true
或false
才能起作用。来自documentation:
使用此属性的组件仅在其值为非null时才使用该值。例如,如果您在
SELECTED_KEY
上将JToggleButton
的Action设置为空值,则JToggleButton
将不会以任何方式更新其选定状态。同样,JToggleButton
的选定状态每次更改时,只会在操作具有SELECTED_KEY
的非空值的情况下,才将值重新设置到操作上。
如果您坚持直接使用侦听器,则ItemListener会指示选择状态,因此可以用来监视JCheckBoxMenuItems和JRadioButtonMenuItems的状态。对于所有其他JMenuItem,请使用ActionListener。
以上内容实际上适用于AbstractButton的所有后代以及JMenuItem及其后代类:
我的理解是,没有理由将ChangeListener与标准JMenuItem或按钮一起使用,因为ChangeEvent主要用于向渲染器指示该组件需要重新绘制。