如果我这样定义了JMenu
和JMenuBar
:
private JMenuBar jMenuBar;
private JMenu jMenu1;
jMenuBar = new JMenuBar();
jMenu1 = new JMenu();
jMenu1.setText("ABOUT");
//and here add a MenuListener so that i can detect when a menu is clicked:
jMenu1.addMenuListener(this);
jMenuBar.add(jMenu1);
setJMenuBar(jMenuBar);
//and here i implement the menulisteners
public void menuSelected(MenuEvent e) {
//my logic here
}
public void menuDeselected(MenuEvent e) {}
public void menuCanceled(MenuEvent e) {}
现在它运作正常。但问题是,如果我有一个以上的菜单,我怎么能区分这两个菜单。 就像在菜单监听器中一样,我怎么知道click1来自menu1或其他菜单2?
我的意思是如果我有另一个菜单,我也为这个菜单添加菜单监听器:
jMenu2.addMenuListener(this);
然后我无法区分点击来自哪个菜单。我怎么能这样做?
答案 0 :(得分:6)
您可以使用MenuEvent类的getSource()
方法。或者您也可以将两个菜单中的单独监听器添加为匿名类。
public void menuSelected(MenuEvent e) {
//Make sure jMenu1 and jMenu2 are accessible in here.
if(e.getSource()==jMenu1)
operationForMenu1();
else if(e.getSource()==jMenu2)
operationForMenu2();
}
或
jMenu1.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent arg0) {
// operation here.
}
@Override
public void menuDeselected(MenuEvent arg0) {
}
@Override
public void menuCanceled(MenuEvent arg0) {
}
});
jMenu2.addMenuListener(new MenuListener() {
@Override
public void menuSelected(MenuEvent arg0) {
// operation here.
}
@Override
public void menuDeselected(MenuEvent arg0) {
}
@Override
public void menuCanceled(MenuEvent arg0) {
}
});
如果您选择第二个选项,则可以轻松使用(在评论中删除@Kleopatra建议)ActionListener
代替MenuListener
。 (只有当你不想对menuCanceled和menuDeselected进行操作时)
答案 1 :(得分:2)
这就是getSource()
的用途,这是MenuEvent
继承自EventObject
的方法。
答案 2 :(得分:1)
您可以改用ActionListener
。以下是如何捕获菜单项上的单击
jMenu1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// Perform action on menu1 clicked here
}
}
如果单击时有多个菜单共享相同的代码,则可以将动作侦听器重构为单独的类。
答案 3 :(得分:0)
我认为向ButtonModel
添加JMenuItem
或向JMenuItems
添加ButtonGroup
的方法之一也可以解决这个问题,例如ButtonModel < / p>
答案 4 :(得分:0)
我来这里看看是否有我更喜欢getSource()的东西,并决定坚持使用getSource。我比较喜欢使用字符串(比较对象),所以我会发布代码,以防对任何人有帮助。 (我知道有些人不喜欢提前退货,不喜欢switch语句,不喜欢K&R。同样,个人喜好,可以根据需要进行调整。)
public void menuSelected(MenuEvent evt) {
String menuName;
Object obj = evt.getSource();
if (obj instanceof JMenu) {
JMenu menu = (JMenu) obj;
menuName = menu.getText();
System.out.println(menuName);
} else {
return;
}
switch (menuName) {
case "Edit":
if (undo.hasPreviousState()) {
jMenuItemEditUndo.setEnabled(true);
} else {
jMenuItemEditUndo.setEnabled(false);
}
if (undo.hasNextState()) {
jMenuItemEditRedo.setEnabled(true);
} else {
jMenuItemEditRedo.setEnabled(false);
}
break;
case "Insert":
DefaultListModel<String> listModel = (DefaultListModel<String>) jListTags.getModel();
if (listModel.contains("table")) {
jMenuItemInsertTable.setEnabled(true);
} else {
jMenuItemInsertTable.setEnabled(false);
}
break;
default:
System.out.println("Menu " + menuName + " not a special case in menuSelected");
}
}
自然,不添加MenuListener()的JMenu甚至不会触发menuSelected()。
答案 5 :(得分:-1)
更改按钮或标签的颜色。简单而简短的xoxo
块报价 公共静态void main()