Используйте
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()
не будет работать. Он неправильно реализован для примера нажатия Ctrl на Mac, поскольку он проверяет, является ли e.getModifiers() & 0x4
ненулевым. Но флаг, используемый для «команды», также 0x4
.
Таким образом, он будет сообщать о щелчке по cmd как о щелчке правой кнопкой мыши, но не будет сообщать о щелчке по Ctrl как одному. Хуже того, 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