Как обнаружить событие щелчка правой кнопкой мыши для Mac OS - PullRequest
6 голосов
/ 04 июня 2010

Для Windows и Linux я могу обнаружить щелчок правой кнопкой мыши. Но для Mac я не знаю, как обнаружить щелчок правой кнопкой мыши.

Как написать Java-программу для обнаружения щелчка правой кнопкой мыши для Mac OS

Спасибо Сунил Кумар Саху

Ответы [ 4 ]

15 голосов
/ 04 июня 2010

Вместо использования MouseEvent.BUTTON3 лучше использовать самодокументацию:

if (SwingUtilities.isRightMouseButton(event))
   // do something

Кроме того, если вы используете этот код для отображения всплывающего меню, вам не следует использовать этот подход, поскольку каждая ОС имеет разные нажатия клавиш для запуска всплывающего меню. Прочитайте раздел из учебника по Swing на Открытие всплывающего меню .

7 голосов
/ 04 июня 2010

Это то же самое, что обнаружение щелчка правой кнопкой мыши в Windows или Linux - вы вызываете метод getButton() данного MouseEvent, чтобы проверить, нажата ли 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() вернет true.

2 голосов
/ 19 июня 2015

Используйте

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
2 голосов
/ 29 сентября 2013

Необходимо добавить поддержку щелчка мышью необходимо добавить, поскольку пользователи Mac могут не использовать мышь со второй кнопкой - например, На трекпаде нет правой кнопки мыши.

@Override
public void mouseClicked(MouseEvent e) {
   // Mac often uses control-click - isControlDown()
   if (SwingUtilities.isRightMouseButton(e) || e.isControlDown()) {
      // do something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...