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

时间:2012-02-20 09:24:24

标签: java swing menu onclick actionlistener

我需要启蒙。

如何添加动作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... :( ");
                }
            }
        );

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

4 个答案:

答案 0 :(得分:15)

您可以向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");

        }
    });

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我使用此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 :(得分:1)

根据之前的答案,我在解决方案中添加了一个额外的密钥监听器

这是一个便利功能:

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