2

如果我已经定义JMenuJMenuBar喜欢这样:

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) {}

现在它工作正常。但问题是如果我有不止一个菜单,我如何区分两者。就像在菜单监听器中一样,我怎么知道点击来自 menu1 或另一个菜单 2?

我的意思是如果我有另一个菜单并且我也为这个菜单添加了菜单监听器:

jMenu2.addMenuListener(this);

然后我无法区分点击来自哪个菜单。我怎样才能做到这一点?

4

6 回答 6

5

您可以使用MenuEventgetSource()的方法。或者,您也可以将单独的侦听器作为匿名类添加到两个菜单。

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) {
        }
    });

如果您选择第二个选项,那么它将很容易使用ActionListener而不是MenuListener. (仅当您不想对 menuCanceled 和 menuDeselected 进行操作时)(按照@Kleopatra 在评论中的建议删除了这个)

于 2011-12-21T12:15:44.127 回答
2

这就是getSource()for,这是一个方法MenuEvent继承自EventObject.

于 2011-12-21T12:14:31.723 回答
1

你可以ActionListener改用。这是捕获对菜单项的单击的方法

 jMenu1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e) {
    // Perform action on menu1 clicked here
  }
 }

如果您有多个菜单在单击时共享相同的代码,那么您可以将动作侦听器重构为一个单独的类。

于 2011-12-21T12:19:06.277 回答
0

我认为其中一种方法是添加或添加ButtonModel到也可以解决问题,例如ButtonModelJMenuItemJMenuItemsButtonGroup

于 2011-12-21T12:14:57.310 回答
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");
    }
}

自然地,没有 addMenuListener() 的 JMenu(s) 甚至不会触发 menuSelected()。

于 2018-06-24T16:18:50.267 回答
-1

更改按钮或标签的颜色。简单而简短的xoxo

块引用 public static void main()

于 2018-06-24T22:23:05.727 回答