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
Grazie per il vostro aiuto, ha davvero aiutato molto. –
FYI Per generare un vero clic con il tasto destro su un Mac, fare clic due volte sul trackpad. – nslntmnx
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