2012-12-02 66 views
2

我正在做一個swing JFrame,並且程序的其中一個功能是使用鼠標的滾輪在窗口中縮放圖像。我已經實現了一個MouseAdapter,它被添加爲JFrame本身的MouseWheelListener。Java - MouseWheelEvent觸發兩次

/** 
* Handles scroll wheel activity. 
*/ 
private MouseAdapter wheelListener = new MouseAdapter() { 
    @Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     int notches = e.getWheelRotation(); 
     System.out.println(notches); 
     while (notches > 0) { 
      controller.zoomIn(); 
      notches--; 
     } 
     while (notches < 0) { 
      controller.zoomOut(); 
      notches++; 
     } 
    } 
}; 

而在JFrame的構造函數:

public MainFrame() { 
    ... 
    addMouseWheelListener(wheelListener); 
    ... 
} 

我遇到的問題是,事件觸發兩次,每次「點擊」滾動滾輪時。我無法找到任何有類似問題的人。

我試着將if(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { ... }放在mouseWheelMoved方法中,看看是否有兩種不同類型的事件發生,但它們都是​​。

我也嘗試打印出事件的來源,看它是否來自不同的窗口/窗格,但他們都從我的主要JFrame窗口。

有沒有人知道,或可以發現,爲什麼我得到兩個事件,當我應該得到一個?

編輯:在添加車輪監聽器部分放錯了行,對不起。 編輯:經過一些測試,我能夠使用.hashCode()來驗證有兩個獨特的MouseWheelEvents。我懷疑MouseAdapter會以某種方式添加兩次。我將它添加到MainFrame的構造函數中,並驗證它只發生在那裏。

+4

當我在我的[sscce](http://sscce.org)中試過你的代碼時,它工作正常。您是否多次添加偵聽器?考慮創建併發佈一個[sscce](http://sscce.org),它向我們展示了您的問題。 –

+2

另外,當你的問題與WindowListeners無關時,爲什麼向我們展示'addWindowListener(...)'位? –

+0

'「我猜想MouseAdapter會以某種方式添加兩次。」:正如我懷疑的那樣。你也沒有顯示有問題的代碼。 –

回答

0

添加e.consume()解決此問題。

private MouseAdapter wheelListener = new MouseAdapter() { 
    @Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     e.consume() // avoid the event to be triggred twice 
     int notches = e.getWheelRotation(); 
     System.out.println(notches); 
     while (notches > 0) { 
      controller.zoomIn(); 
      notches--; 
     } 
     while (notches < 0) { 
      controller.zoomOut(); 
      notches++; 
     } 
    } 
}; 
+0

這對我來說非常合適!謝謝。 –