Как обнаружить событие щелчка правой кнопкой мыши для Mac OS
Для Windows и Linux я могу обнаружить щелчок правой кнопкой мыши. Но для Mac я не знаю, как обнаружить щелчок правой кнопкой мыши.
Как написать Java-программу для обнаружения щелчка правой кнопкой мыши для Mac OS
Спасибо Сунил Кумар Саху
4 ответа
Это то же самое, что обнаружение щелчка правой кнопкой мыши на Windows или Linux - вы называете данный MouseEvent getButton()
способ проверить, если BUTTON3
была нажата. Например, взгляните на следующий фрагмент примера MouseListener:
public class MyListener implements MouseListener
{
// ... code ...
public void mouseClicked(MouseEvent event)
{
if (event.getButton() == MouseButton.BUTTON3)
{
// Right-click happened
}
}
}
Однако, это обнаруживает только щелчки правой кнопкой мыши, если пользователь фактически имеет двухкнопочную мышь. Так как у большинства мышей Mac была только одна кнопка, не так давно, вы можете рассмотреть возможность обнаружения Control-щелчков (это была обычная идиома для щелчка правой кнопкой мыши). Если вы решите сделать это, реализация будет довольно тривиальной: просто добавьте еще одну проверку, если event.isControlDown()
возвращает истину.
Вместо использования MouseEvent.BUTTON3 лучше использовать самодокументирующий подход.
if (SwingUtilities.isRightMouseButton(event))
// do something
Кроме того, если вы используете этот код для отображения всплывающего меню, то вам не следует использовать этот подход, поскольку каждая ОС имеет разные нажатия клавиш для запуска всплывающего меню. Прочитайте раздел из учебника по Swing по созданию всплывающего меню.
Использование
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
Необходимо добавитьподдержку нажатий клавиш управления, поскольку пользователи Mac могут не использовать мышь со второй кнопкой - например, трекпад не имеет правой кнопки мыши.
@Override
public void mouseClicked(MouseEvent e) {
// Mac often uses control-click - isControlDown()
if (SwingUtilities.isRightMouseButton(e) || e.isControlDown()) {
// do something