Использование
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()
не будет работать. Он неверно реализован для примера Mac ctrl-click, потому что он проверяет, отличен ли e.getModifiers() & 0x4
. Но флаг, используемый для «команды», также равен 0x4
.
Таким образом, он будет сообщать cmd-click как щелчок правой кнопкой мыши, но не будет сообщать об этом ctrl-click. Хуже того, cmd-click также вернет true
в SwingUtilities.isLeftMouseButton()
. Если ваш код написан для того, чтобы обрабатывать левые клики в одну сторону и щелкнуть правой кнопкой мыши другую, а вы используете второй if
, а не else if
, вы будете испытывать неприятный сюрприз, когда оба выполняются.
Для тех, кому это интересно, это значения getModifiers()
и getModifiersEx()
для одномоментных кликов.
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
Благодарим за помощь. На самом деле это помогло. –
FYI Чтобы создать истинный щелчок правой кнопкой мыши на Mac, нажмите двумя пальцами на трекпад. – nslntmnx
Я думаю, вы имели в виду MouseEvent.BUTTON3 - MouseButton - это что-то еще. (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