2013-04-23 1 views
2

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

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

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. Как кажется Качели видит это по-другому и посылает событие действия независимо от того, какая кнопка мыши была нажата, - в отличие от JButton, который ничего не загорается, если не щелкнуть мышью. 1.

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

Есть ли способ, которым я могу сообщить JMenuItem, что он должен реагировать только на кнопку мыши 1 и это ускоритель? Аналогично тому, как JButton не так ли?

ответ

0
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)); 

Edit:

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

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

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

+0

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

+0

@ пользователь1728176 см. Мое редактирование. – Aboutblank