слушатель действия Java в меню, а не в пункте меню - PullRequest
4 голосов
/ 20 февраля 2012

Мне нужно просветление.

как добавить действие 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 ]

15 голосов
/ 20 февраля 2012

Вы можете добавить ActionListener к JMenu, так как этот метод унаследован от AbstractButton. (Документация JMenu)

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

Но он не предназначен для использования таким образом: JMenu игнорирует ActionEvent . Вы должны использовать MenuEvent и MenuListener вместо.

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 голос
/ 29 декабря 2016

на основе предыдущих ответов я добавил к решению дополнительный ключевой слушатель .

Вот вспомогательная функция:

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) {}
        });
    } 
1 голос
/ 31 августа 2014

Я использую это 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);
        }
    });

}
1 голос
/ 20 февраля 2012

Если вы создали экземпляр класса JMenu для создания объекта меню, попробуйте метод addMenuListener ().

...