2013-04-23 22 views
2

所以我必須在Swing中爲我的Java類創建一個簡單的GUI,並且我偶然發現了這個小問題。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)); 

編輯:

我已經改變了我的答案,而不是檢查時,該事件被解僱,你應該檢查時,不會觸發它。所以在這種情況下,Button3或右鍵單擊。當您按下「q」或任何鼠標點擊時,事件將始終激活。

上一個答案很糟糕,您不想使用e.getModifiers(),因爲它可能會爲您不希望返回true的事件返回true。例如如果您將「q」和「w」設置爲相同的按鈕,但它們做了不同的事情,則兩個事件都會觸發第一個語句檢查e.getModifiers() == 0

對不起,我希望這會更有意義。

+0

感謝您的回答,但我不確定是否理解正確。當我檢查e.getModifiers()== KeyEvent.VK_Q'時,它不起作用,我認爲這是因爲'e.getModifiers()'在被加速器觸發時返回0,這使得它與被觸發的事件無法區分通過,讓我們來說,鼠標按鈕4. 編輯:對不起,錯過了你的第一行代碼。也想到這一點,但問題是修改器會與其他鼠標按鈕相比,而不僅僅是加速器,而不是1,2或3。 – user1728176 2013-04-23 19:44:30

+0

@ user1728176請參閱我的編輯。 – Aboutblank 2013-04-23 21:19:04