Вызов MouseEvent getModifiersEx () не работает должным образом (или как задокументировано) - PullRequest
0 голосов
/ 04 марта 2020

У меня есть некоторые классы, необходимые для перехода от старого устаревшего вызова: MouseEvent getModifiers ()

, которые необходимо преобразовать в новый стиль: MouseEvent getModifiersEx ()

Нажатие на фрейм в примере вызывает слушатель мыши. Обратите внимание, что (устарело) getModifiers () дает ожидаемые результаты для rt-click против lt-click:

 right click: 4, left click: 16

Это показывает, что rt-click отличается от lt-click и значения битов соответствуют ожидаемым .

Однако использование getModifiersEx () не показывает ожидаемые значения.

Ожидаемые битовые значения для getModifiersEx:

 right click: 4096, left click: 1024

Но фактические значения:

 right click: 0, left click: 0

Это делает rt-click vs lt-click неразличимым.

Обратите внимание, что нажатие клавиш-модификаторов (например, Shift, Cntrl, Alt) действительно устанавливает ожидаемые биты (но биты маски при нажатии кнопки по-прежнему равны нулю, поэтому щелчок правой кнопкой мыши по сравнению с щелчком мыши по-прежнему неразличим)

Вызов MouseEvent getButton () возвращает правильную кнопку, так что это обходной путь. Но почему getModifiersEx () не работает?

Это на MacOS BTW

/**Example showing issue with MouseEvent.getModifiersEx()*/
public class TrialGetModEx extends JFrame {

  public TrialGetModEx() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(300, 200);
    setLocation(100,100);
    setVisible(true);

    addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        System.out.print("Mod="+e.getModifiers());
        System.out.print(" ModEx="+e.getModifiersEx());
        System.out.println();
      }

    });

    System.out.println("Expected Bit values:");
    System.out.println("  BUTTON_1_MASK: "+MouseEvent.BUTTON1_MASK);
    System.out.println("  BUTTON_3_MASK: "+MouseEvent.BUTTON3_MASK);
    System.out.println("  BUTTON_1_DOWN_MASK: "+MouseEvent.BUTTON1_DOWN_MASK);
    System.out.println("  BUTTON_3_DOWN_MASK: "+MouseEvent.BUTTON3_DOWN_MASK);
  }

  public static void main(String[] args) {
    new TrialGetModEx();
  }
}

1 Ответ

0 голосов
/ 04 марта 2020

Хорошо, после небольшого расследования, отвечая на мой собственный вопрос здесь.

Хотя в документации рекомендуется заменить устаревшую MouseEvent getModifiers () на getModifiersEx (), между этими двумя есть фундаментальное различие.

А именно, getModifiersEx () представляет состояние кнопок мыши в режиме реального времени, что означает, что к тому времени, когда происходит событие щелчка, кнопка уже была отпущена (по определению). Вот почему он всегда показывает, что ни одна кнопка не нажата.

Поэтому getModifiersEx () более полезен для нажатий кнопок во время события mousePressed (), а не столько для событий mouseClicked () или mouseReleased ().

Единственное исключение будет для специализированных ситуаций, таких как, скажем, отслеживание нескольких отдельных нажатий кнопок.

Фактическая вещь, которая заменяет детекторы щелчков старого стиля:

if((event.getModifiers() & MouseEvent.BUTTON3_MASK) != 0)

- это не getModifiersEx, а:

if(event.getButton()==MouseEvent.BUTTON3)

...