有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing java操作侦听器在菜单上,而不是在菜单项上

我需要启迪

如何将action actionListener事件绑定到菜单,而不是绑定到菜单项 这是(在menuITEM上)有效的演示代码

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

但是当我尝试同样的方法时,只是在菜单上,它不起作用

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

是否可以将侦听器添加到菜单?我教过听众可以加入任何东西


共 (4) 个答案

  1. # 1 楼答案

    如果实例化JMenu类以创建菜单对象,请尝试addMenuListener()方法

  2. # 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);
            }
        });
    
    }
    
  3. # 3 楼答案

    您可以将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");
    
            }
        });
    
  4. # 4 楼答案

    根据前面的答案,我在解决方案中添加了一个额外的键侦听器

    这是一个方便的功能:

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