【问题标题】:java action listener on menu, and not on menu item菜单上的java动作监听器,而不是菜单项
【发布时间】:2026-02-03 23:50:02
【问题描述】:

我需要启蒙。

如何添加action的actionListener事件绑定到菜单,而不是绑定到菜单ITEM 这是演示代码,可以工作(在 menuITEM 上)..

menuFileItem.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("It works");
                }
            }
        );

但是当我尝试相同的时候,但只是在 MENU 本身上它不起作用!

menuFile.addActionListener(
            new ActionListener(){
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("Plz work... :( ");
                }
            }
        );

是否可以在菜单中添加监听器?我教的听众可以添加到所有内容中。

【问题讨论】:

    标签: java swing menu onclick actionlistener


    【解决方案1】:

    根据之前的回答,我在解决方案中添加了一个额外的key listener

    这是一个方便的函数:

    public static void bind(JMenu menu, ActionListener listener) {
    
            menu.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate"));
                }
            });
    
            menu.addMenuKeyListener(new MenuKeyListener() {
    
                @Override
                public void menuKeyPressed(MenuKeyEvent e) {
    
                    if(e.getKeyCode() != KeyEvent.VK_ENTER){
                        return;
                    }
    
                    // Find out if the menu is the currently selected menu element
                    MenuElement[] selectionPath = e.getMenuSelectionManager().getSelectedPath();
    
                    // Because the JMenu will open a popup menu, the menu is the penultimate element in the path
                    if (selectionPath.length < 2) {
                        return;
                    }
    
                    MenuElement selectedMenu = selectionPath[selectionPath.length - 2];
    
                    if (selectedMenu == menu) {
                        listener.actionPerformed(new ActionEvent(e.getSource(), ActionEvent.ACTION_PERFORMED, "Delegate"));
                    }
                }
    
                @Override
                public void menuKeyTyped(MenuKeyEvent e) {}
    
                @Override
                public void menuKeyReleased(MenuKeyEvent e) {}
            });
        } 
    

    【讨论】:

      【解决方案2】:

      我使用这个addMouseListener(),因为当您点击JMenu 时,它会将其标记为蓝色并在之后执行该事件。

      我想这就是你想要的效果。

      在这里它使用以下代码工作: 我声明:

      JMenu jmCadastrar = new JMenu("Cadastrar");
      
      jmCadastrar.addMouseListener(new MouseListener() {
      
              @Override
              public void mouseReleased(MouseEvent e) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public void mousePressed(MouseEvent e) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public void mouseExited(MouseEvent e) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public void mouseEntered(MouseEvent e) {
                  // TODO Auto-generated method stub
      
              }
      
              @Override
              public void mouseClicked(MouseEvent e) {
                  // TODO Auto-generated method stub
                  System.exit(0);
              }
          });
      
      }
      

      【讨论】:

      • 谢谢!此解决方案也适用于多个 JMenus。
      【解决方案3】:

      如果您实例化 JMenu 类来构建菜单对象,请尝试方法 addMenuListener()。

      【讨论】:

      • 这听起来很有趣,你能提供工作示例吗?我从来没有用过那种方法。
      • 当然可以。下面是你可以完成的代码。 JMenu menuFileItem= new JMenu(); menuFileItem.addMenuListener( new MenuListener(){ public void menuSelected(MenuEvent e) { throw new UnsupportedOperationException("尚不支持。"); } public void menuDeselected(MenuEvent e) { throw new UnsupportedOperationException("尚不支持。"); } public void menuCanceled(MenuEvent e) { throw new UnsupportedOperationException("Not supported yet."); } } );
      【解决方案4】:

      您可以将ActionListener 添加到JMenu,因为此方法继承自AbstractButton(JMenu Documentation)

      JMenu menu = new JMenu("MyMenu");
      menu.addActionListener(new ActionListener(){...});
      

      但是,它不打算以这种方式使用:JMenu ignores ActionEvent。您应该改用MenuEventMenuListener

      JMenu menu = new JMenu("MyMenu");
      menu.addMenuListener(new MenuListener() {
      
              @Override
              public void menuSelected(MenuEvent e) {
                  System.out.println("menuSelected");
      
              }
      
              @Override
              public void menuDeselected(MenuEvent e) {
                  System.out.println("menuDeselected");
      
              }
      
              @Override
              public void menuCanceled(MenuEvent e) {
                  System.out.println("menuCanceled");
      
              }
          });
      

      【讨论】:

      • 我这样做了,我在构造函数之前声明了菜单,并在该类的构造函数中创建了它,当我尝试实现 menu.addActionListener 时......它不起作用。你能提供你的解决方案的工作示例吗?
      • 工作!谢谢!!我只是因为 1 种方法变得更聪明了......:D 笑话......真的谢谢你,现在我的应用程序看起来会更流畅.. 几天前我开始使用 java 工作,从头开始.. 所以我正处于学习阶段现在。再次感谢伴侣!上帝祝福你! :)