2012-07-12 172 views
2

我在主Jframe上實現了打開菜單偵聽器的右鍵單擊,除了一個問題外,它工作正常。五分之一(給予或帶走)點擊它沒有響應,這對用戶來說可能非常煩人。這裏是我的代碼:Java Swing中的MouseListener有時不響應

contentPane = new JPanel(); 
contentPane.addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 

      if (e.getButton() == MouseEvent.BUTTON3) 
      { 
       //Do Stuff 
      } 
     } 
    }); 

能否請你幫我

+0

連續五分之一?或者每5次出現? – 2012-07-12 13:47:47

+0

可能是因爲長時間運行的進程阻止了EventDispatchingThread運行? – MadProgrammer 2012-07-12 13:49:27

+0

你確定要'MouseEvent.BUTTON3'嗎?不是典型的「BUTTON2」右鍵單擊? – MikeTheLiar 2012-07-12 13:50:13

回答

10
  1. 你不會得到來自contentPane子組件的點擊。

    我認爲你的問題是你已經添加了東西到你的面板。當用戶點擊子組件佔用的區域時,該子組件獲得點擊事件。

    快速修復:我建議您爲所有子組件添加相同的鼠標偵聽器。

  2. 你是不是「點擊」

    的點擊當按下和釋放鼠標真的很快的。如果你不小心,你可能會得到(例如)「按下,移動,釋放」事件而不是「點擊」事件。

    快速修復:改爲使用mouseReleased事件。

+0

我相信就是這樣,因爲他確實提到他有* OpenMenu *組件。 Asker必須將他的mouselistener添加到**那個組件中。 – 2012-07-12 13:57:32

+0

嗡嗡聲,我只看到一個面板和丟失的鼠標事件。在執行什麼可能有些東西,但我認爲我的答案仍然適用。 – dacwe 2012-07-12 14:03:37

+2

哇,謝謝!從來沒有想過它。這是我的問題,當我移動一點它沒有奏效。 – DanM 2012-07-12 14:05:06

0

使用此代碼來代替:

private MouseAdapter listener = new MouseAdapter() { 

    public void mouseReleased(MouseEvent e) { 
     if (downer) { 
      downer = false; 
      if (new Rectangle(e.getComponent().getLocationOnScreen(), e.getComponent().getSize()) 
        .contains(e.getLocationOnScreen())) { 
       downer = false; 
       // CODE 
       new Thread(new Runnable(){ 
        public void run(){ 
         //Your Listener code 
        } 
       }).start(); 

       /// COde 
      } 
     } 
    } 

    boolean downer = false; 

    public void mousePressed(java.awt.event.MouseEvent e) { 
     downer = true; 
    } 
}; 

如果按組件和釋放組件上此代碼僅反應,並開始自定義任務一個新線程。這應該總是有效,因爲AWT線程不會被長時間計算阻塞。