Uso
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()
no funcionará. Está implementado incorrectamente para el ejemplo de Mac ctrl-click porque comprueba si e.getModifiers() & 0x4
es distinto de cero. Pero la bandera utilizada para "comando" también es 0x4
.
Por lo tanto, se informará cmd-clic como un clic derecho, pero no se informará ctrl-clic como uno solo. Peor aún, cmd-click también devolverá true
a SwingUtilities.isLeftMouseButton()
. Si su código está escrito para manejar los clics izquierdos de una manera y hace clic con el botón derecho sobre otro, y usa un segundo if
en lugar de un else if
, se llevará una desagradable sorpresa cuando ambos se ejecuten. Para los interesados, estos son los valores getModifiers()
y getModifiersEx()
completos para clics de un solo modificador.
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
Gracias por su ayuda, Realmente me ayudó mucho. –
FYI Para generar un verdadero clic derecho en una Mac, haga doble clic en el trackpad. – nslntmnx
Creo que se refería a MouseEvent.BUTTON3 - MouseButton es otra 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