2010-06-04 8 views

risposta

7

E 'lo stesso di rilevamento di un tasto destro del mouse su Windows o Linux si chiama il proprio dato metodo di MouseEvent getButton() per verificare se è stato fatto clic su BUTTON3. Ad esempio, date un'occhiata al seguente frammento di un esempio MouseListener:

public class MyListener implements MouseListener 
{ 
    // ... code ... 

    public void mouseClicked(MouseEvent event) 
    { 
     if (event.getButton() == MouseButton.BUTTON3) 
     { 
      // Right-click happened 
     } 
    } 
} 

Tuttavia, questo rileva solo fa clic destro se l'utente ha in realtà un mouse a due pulsanti. Dal momento che la maggior parte dei mouse Mac aveva solo un pulsante fino a non molto tempo fa, si potrebbe prendere in considerazione la possibilità di rilevare anche Control-click (che era l'idioma comune per fare clic con il tasto destro del mouse). Se si decide di farlo, l'implementazione è piuttosto banale: basta aggiungere un altro controllo per verificare se event.isControlDown() restituisce true.

+0

Grazie per il vostro aiuto, ha davvero aiutato molto. –

+0

FYI Per generare un vero clic con il tasto destro su un Mac, fare clic due volte sul trackpad. – nslntmnx

+0

Penso che intendessi MouseEvent.BUTTON3 - MouseButton è un'altra cosa. (http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html, https://docs.oracle.com/javafx/2/api/javafx/scene/input /MouseButton.html) – shieldgenerator7

15

Invece di usare MouseEvent.BUTTON3, un bettter approccio sé docummenting è quello di utilizzare

if (SwingUtilities.isRightMouseButton(event)) 
    // do something 

Inoltre, se si utilizza questo codice per visualizzare un menu a comparsa, quindi non dovrebbe usare questo approccio in quanto ogni Il sistema operativo ha diversi tratti chiave per rinnovare il menu popup. Leggi la sezione dal tutorial Swing su Bringing Up a Popup Menu.

2

Il supporto del controllo di controllo deve essere aggiunto poiché gli utenti Mac potrebbero non utilizzare un mouse con il secondo pulsante - ad es. Un trackpad non ha il pulsante destro del mouse.

@Override 
public void mouseClicked(MouseEvent e) { 
    // Mac often uses control-click - isControlDown() 
    if (SwingUtilities.isRightMouseButton(e) || e.isControlDown()) { 
     // do something 
1

Usa

private static boolean isRightClick(MouseEvent e) { 
    return (e.getButton()==MouseEvent.BUTTON3 || 
      (System.getProperty("os.name").contains("Mac OS X") && 
        (e.getModifiers() & InputEvent.BUTTON1_MASK) != 0 && 
        (e.getModifiers() & InputEvent.CTRL_MASK) != 0)); 
} 

SwingUtilities.isRightMouseButton() non funzionerà. È stato implementato in modo errato per l'esempio Mac ctrl-clic perché controlla se e.getModifiers() & 0x4 è diverso da zero. Ma la bandiera usata per "comando" è anche 0x4.

Quindi segnalerà cmd-clic come clic con il tasto destro, ma non segnalerà ctrl-clic come uno. Peggio ancora, cmd-click restituirà anche true a SwingUtilities.isLeftMouseButton(). Se il tuo codice è stato scritto per gestire i clic di sinistro in un modo e fare clic con il tasto destro su un altro, e usi un secondo if invece di uno else if, ti verrà una brutta sorpresa quando eseguiranno entrambi.

Per coloro che sono interessati, questi sono i valori completi getModifiers() e getModifiersEx() per clic su un singolo modificatore.

Left click: (button 1) 
Basic: 0000010000 0000000000 16 0 
Shift: 0000010001 0001000000 17 64 
Ctrl: 0000010010 0010000000 18 128 
Cmd: 0000010100 0100000000 20 256 
Opt: 0000011000 1000000000 24 512 

Mid click: (button 2) 
Basic: 0000001000 1000000000 8 512 
Shift: 0000001001 0001000000 9 64 
Ctrl: 0000001010 0010000000 10 128 
Cmd: 0000001100 0100000000 12 256 
Opt: 0000001000 1000000000 8 512 

Right click: (button 3) 
Basic: 0000000100 0100000000 4 256 
Shift: 0000000101 0001000000 5 64 
Ctrl: 0000000110 0010000000 6 128 
Cmd: 0000010100 0100000000 20 256 
Opt: 0000001100 1000000000 12 512 
Problemi correlati