我有一个Java程序,其中我有一个具有任意数量项目的JMenu(在这种情况下,当前在不同程序中加载的每个动态库都有一个菜单项)。我正在运行一个循环来将JCheckBoxMenuItem添加到菜单中,因为我不知道会有多少。
如何为这些菜单项设置一个动作监听器,知道哪个选项称为它?具体来说,我想运行相同的功能,但为每个菜单项使用不同的设置或参数(根据检查是否正在切换或取消检查,再次使用不同的功能)。
有人能指出我正确的方向吗?
答案 0 :(得分:2)
绝对读过:http://java.sun.com/docs/books/tutorial/uiswing/misc/action.html
简而言之,将ActionListener添加到menuItems。在actionPerformed方法中,使用event.getSource()。如果需要,可以将SAME ActionListener添加到所有菜单项中。
答案 1 :(得分:2)
虽然event.getSource()肯定会让您知道事件来自哪个特定按钮,但它具有需要跟踪生成的按钮或窥探按钮的副作用。此外,您可能希望向用户显示库的不同名称(可能包括版本信息),而不是用于标识库。使用按钮的“ActionCommand”属性可以提供分离这些问题的方法。因此,您需要在生成复选框菜单项和侦听器中更改代码。
ActionListener actionListener = ... // whatever object holds the method, possibly this
String[] libraries = ... // however you get your library names
JMenu parentMenu = ... // the menu you are adding them to
for (String s : libraries) {
// prettyName is a method to make a pretty name, perhaps trimming off
// the leading path
JCheckBoxMenuItem child = new JCheckBoxMenuItem(prettyName(s), true);
child.setActionCommand(s);
parentMenu.acc(child);
}
动作处理程序代码将是......
public void actionPerformed(ActionEvent evt) {
// the 'current' selection state, i.e. what it is going to be after the event
boolean selected = ((JCheckBoxMenuItem)evt.getSource()).isSelected();
String library = evt.getActionCommand();
... process based on library and state here...
}
答案 2 :(得分:1)
event.getSource()应该这样做。
答案 3 :(得分:1)
构建菜单时,您可以将Action
对象传递给配置了给定操作所需的任何选项的JCheckBoxMenuItem
(您也可以将复选框的引用推送到那里以检查状态)。这样,在实际执行操作时,您不必进行任何类型的处理,因为将调用正确的操作。
答案 4 :(得分:0)
干净的方法是为每个人创建一个不同的ActionListener
。 EventObject.getSource
很难看。