JMenuItem - как выяснить, было ли действие вызвано ускорителем?

Поэтому мне нужно создать простой графический интерфейс в Swing для моего класса Java, и я наткнулся на эту небольшую косметическую проблему.

У меня есть следующий код:

    JMenuItem mntmQuit = new JMenuItem("Quit");
    mntmQuit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getModifiers() == MouseEvent.BUTTON1_MASK) {
                System.out.println("You should fire.");
            } else if (e.getModifiers() == MouseEvent.BUTTON2_MASK || e.getModifiers() == MouseEvent.BUTTON3_MASK) {
                System.out.println("Why do you fire this event?");
            } else {
                System.out.println("And how can I catch when the accelerator was used?");
            }
        }
    });
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0));

Я никогда не видел пункт меню, который вызывался бы при щелчке правой кнопкой мыши или использовании любой другой кнопки мыши, кроме кнопки 1. Кажется, что Swing видит это по-другому и отправляет событие действия независимо от того, какая кнопка мыши была нажата — в отличие от JButton, который ничего не сработает, пока не будет нажата первая кнопка мыши.

Теперь я мог бы жить с этим, так как я могу легко поймать кнопку мыши 1 и выполнить свои действия, но как насчет того, чтобы поймать использование акселератора? Он вызовет событие действия, но я не вижу возможности его перехватить, поскольку он возвращает «0» в качестве модификатора (так же, как и любые другие кнопки мыши, кроме 1, 2 и 3).

Могу ли я каким-либо образом сказать JMenuItem, что он должен реагировать только на первую кнопку мыши и ее акселератор? Похоже на то, как это делает JButton?


person user1728176    schedule 23.04.2013    source источник


Ответы (1)


    JMenuItem mntmQuit = new JMenuItem("Quit");
    mntmQuit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (!(e.getModifiers() == InputEvent.BUTTON3_MASK)) {
                System.out.println(e.getActionCommand());
            }
        }
    });
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0));

Изменить:

Я изменил свой ответ, вместо того, чтобы проверять, когда событие запускается, вы должны проверять, когда НЕ запускать его. Так что в этом случае Button3 или щелкните правой кнопкой мыши. Событие всегда срабатывает, когда вы нажимаете «q» или любой щелчок мышью.

Предыдущий ответ был плохим, вы не хотите использовать e.getModifiers(), потому что он потенциально может возвращать true для событий, которые вы не хотите возвращать. например если вы установили «q» и «w» на одну и ту же кнопку, но они выполняют разные действия, оба события сработают при первой проверке if оператора e.getModifiers() == 0

Извините за путаницу, надеюсь, это имеет больше смысла.

person Aboutblank    schedule 23.04.2013
comment
Спасибо за ответ, но я не уверен, правильно ли я это понимаю. Когда я проверяю e.getModifiers() == KeyEvent.VK_Q, это не работает, я думаю, это потому, что e.getModifiers() возвращает 0 при запуске ускорителем, и это делает его неотличимым от событий, запускаемых, скажем, кнопкой мыши 4. Изменить: извините, пропустил вашу первую строку кода . Я тоже об этом думал, но тогда проблема будет заключаться в том, что модификатор соответствует любой другой кнопке мыши, кроме 1, 2 или 3, а не только ускорителю. - person user1728176; 23.04.2013