如何确定哪个菜单项称为ActionListener?

时间:2009-02-26 00:49:47

标签: java swing events menu menuitem

我有一个Java程序,其中我有一个具有任意数量项目的JMenu(在这种情况下,当前在不同程序中加载的每个动态库都有一个菜单项)。我正在运行一个循环来将JCheckBoxMenuItem添加到菜单中,因为我不知道会有多少。

如何为这些菜单项设置一个动作监听器,知道哪个选项称为它?具体来说,我想运行相同的功能,但为每个菜单项使用不同的设置或参数(根据检查是否正在切换或取消检查,再次使用不同的功能)。

有人能指出我正确的方向吗?

5 个答案:

答案 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)

干净的方法是为每个人创建一个不同的ActionListenerEventObject.getSource很难看。