2013-07-03 67 views
11

如何知道mouseDragged事件中按下的按鈕?mouseDragged沒有返回合適的按鈕

我在mouseDragged()中遇到問題,因爲收到的MouseEvent對於getButton()返回0。我對鼠標位置沒有任何問題,甚至沒有檢測到鼠標點擊。 mouseClicked()事件返回getButton()的相應按鈕。

有關我如何做到這一點的任何建議?我想我可以使用mouseClickedmousePressed做一個解決方法,但是我寧願將它全部保留在mouseDragged之內。

感謝您的時間和答案。

+0

你可以用鼠標右鍵拖動,我只用鼠標左鍵拖動 – DevZer0

+1

我測試了兩個按鈕,並且兩個按鈕都發送了0。 –

回答

16

正如意見和其他的答案中指出,SwingUtilities類提供了這樣的情況下三種方法,這應該爲所有MouseEvents工作:

SwingUtilities.isLeftMouseButton(aMouseEvent); 
SwingUtilities.isRightMouseButton(aMouseEvent); 
SwingUtilities.isMiddleMouseButton(aMouseEvent); 

至於什麼問題,你的做法是,中getButton()的Javadoc說:

返回哪裏,如果有的話,鼠標按鈕已改變狀態。

由於按鈕被同時向下不會改變的狀態,getButton()通常會在mouseDragged返回NO_BUTTON。要檢查按鈕和修改器的狀態,如Ctrl替代等在mouseDragged中,可以使用getModifiersEx()。作爲一個例子,下面的代碼將檢查BUTTON1是下降,但BUTTON2是不是:

int b1 = MouseEvent.BUTTON1_DOWN_MASK; 
int b2 = MouseEvent.BUTTON2_DOWN_MASK; 
if ((e.getModifiersEx() & (b1 | b2)) == b1) { 
    // ... 
} 
+0

你對第一部分(javadoc)是正確的,但我認爲使用'SwingUtilities.isLeftMouseButton()'更好(見其他答案) – xav

+1

@xav由於這已經是我接受的答案,我添加了SwingUtilities方法以提高可視性(並擴展了爲什麼你可以選擇'getModifiersEx'來代替)。 –

0

這可能是您的Java沙箱的問題。

以下代碼一直運行良好(幾乎如你所見)。

@Override 
public void mouseDragged(MouseEvent e) { 
    e.getButton(); 
} 

請在不同的機器上試試你的代碼。

2
int currentMouseButton = -1; 
@Override 
public void mousePressed(MouseEvent e) { 
    currentMouseButton = e.getButton(); 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    currentMouseButton = -1; 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    if (currentMouseButton == 3) { 
     System.out.println("right button"); 
    } 
} 
6

雅各正確的getButton()不會讓你設計的按鈕。然而,我發現不是位操作的簡潔的解決方案上getModifiersEx(),你也可以內mouseDragged使用:中按鍵和右鍵存在

if (SwingUtilities.isLeftMouseButton(theMouseEvent)) { 
    //do something 
} 

類似的方法。

+0

你是對的。我想這比getModifiersEx()更適合於可移植性(MacOS,Linux,...)) – xav

+0

@xav在可移植性方面,[getModifiersEx()](https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html#getModifiersEx())恰恰是相同(非常便攜),因爲'isLeftMouseButton(..)'&co。方法是以它的方式來實現的。見[這裏](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/SwingUtilities.java#SwingUtilities.isLeftMouseButton%28java.awt.event .MouseEvent%29)。這些只是更易讀的便利方法。 –