繁体   English   中英

菜单上的java动作监听器,而不是菜单项

[英]java action listener on menu, and not on menu item

我需要启蒙。

如何添加动作actionListener事件绑定到菜单,而不绑定到菜单ITEM这里是演示代码,有效(在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... :( ");
                }
            }
        );

可以将监听器添加到菜单中吗? 我教过听众可以添加到一切。

您可以将ActionListener添加到JMenu因为此方法是从AbstractButton继承的。 (JMenu文档)

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

但是,它不打算以这种方式使用: JMenu忽略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");

        }
    });

我使用这个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);
        }
    });

}

根据之前的答案,我为解决方案添加了一个额外的关键监听器

这是一个便利功能:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM