2013-07-03 10 views
11

Come è possibile conoscere il pulsante premuto all'interno di un evento mouseDragged?mouseDragged che non restituisce il pulsante appropriato in basso

Ho un problema in mouseDragged() perché il MouseEvent ricevuto restituisce 0 per getButton(). Non ho alcun problema con la posizione del mouse, o anche rilevando clic del mouse. L'evento mouseClicked() restituisce il pulsante appropriato per getButton().

Qualche suggerimento su come posso farlo? Presumo che potrei fare un work-around usando mouseClicked, o mousePressed, ma preferirei mantenere tutto questo all'interno di mouseDragged.

Grazie per il vostro tempo e le vostre risposte.

+0

Si può trascinare con il pulsante destro del mouse, ho solo trascinato con il tasto sinistro del mouse – DevZer0

+1

Ho testato entrambi i pulsanti e inviato 0 per entrambi i pulsanti. –

risposta

16

Come sottolineato nei commenti e altre risposte, SwingUtilities fornisce tre metodi per casi come questo, che dovrebbe funzionare per tutti MouseEvents:

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

Quanto a ciò che il problema con il vostro approccio è, il javadoc di getButton() dice:

Restituisce quale, se presente, dei pulsanti del mouse ha cambiato stato.

Poiché lo stato del pulsante non cambia mentre viene tenuto premuto, getButton() di solito tornare NO_BUTTON in mouseDragged. Per verificare lo stato dei pulsanti e dei modificatori come Ctrl, Alt, ecc. In mouseDragged, è possibile utilizzare getModifiersEx(). A titolo di esempio, il codice qui sotto controlla che BUTTON1 è giù, ma non è BUTTON2:

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

Hai ragione riguardo alla prima parte (javadoc), ma penso che l'uso di 'SwingUtilities.isLeftMouseButton()' sia ancora migliore (vedi altra risposta) – xav

+1

@xav Poiché questa è già la risposta accettata, ho aggiunto l'approccio di SwingUtilities per una migliore visibilità (e ampliato il motivo per cui potresti scegliere 'getModifiersEx'). –

0

Questo potrebbe essere un problema della tua sandbox java.

Il seguente codice funziona sempre bene (quasi, come potete vedere).

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

Si prega di provare il codice su una macchina diversa.

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

diritto di Giacobbe che getButton() non ti ottenere il pulsante di progettazione. Tuttavia, ho trovato una soluzione più pulita rispetto alle operazioni bit su getModifiersEx(), che è anche possibile utilizzare entro mouseDragged: esistere

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

metodi simili per il pulsante centrale e il tasto destro.

+0

Hai ragione. E credo che questo sia anche meglio per la portabilità di 'getModifiersEx()' (MacOS, Linux, ...) – xav

+0

@xav In termini di portabilità, [getModifiersEx()] (https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html#getModifiersEx()) è esattamente il stesso (molto portabile), perché 'isLeftMouseButton (..)' & co. i metodi sono implementati in termini di esso. Vedi [qui] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/SwingUtilities.java#SwingUtilities.isLeftMouseButton%28java.awt.event .MouseEvent% 29). Questi sono metodi di convenienza semplicemente più leggibili. –