В чем разница между BUTTON1_MASK и BUTTON1_DOWN_MASK?

С веб-сайта Java:

BUTTON1_DOWN_MASK = The Mouse Button1 extended modifier constant.
BUTTON1_MASK = The Mouse Button1 modifier constant.

Я даже не уверен, что такое "константа модификатора". Не говоря уже о расширенном. Я понимаю, однако, что BUTTON1_MASK это просто целочисленное представление для нажатия левой кнопки мыши.

2 ответа

Решение

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

Есть два метода, которые возвращают такие наборы констант: InputEvent#getModifiers() а также InputEvent#getModifiersEx(), и они будут возвращать константы-модификаторы или расширенные константы-модификаторы соответственно.

Из документов (жирным шрифтом является мое):

Маска кнопки, возвращенная функцией InputEvent.getModifiers(), отражает только кнопку, состояние которой изменилось, а не текущее состояние всех кнопок... Чтобы получить состояние всех кнопок и клавиш-модификаторов, используйте InputEvent.getModifiersEx().

а также (жирный шрифт мой):

Расширенные модификаторы представляют состояние всех модальных клавиш, таких как ALT, CTRL, META и кнопки мыши сразу после того, как произошло событие

Например, если пользователь нажимает кнопку 1, а затем кнопку 2, а затем отпускает их в том же порядке, генерируется следующая последовательность событий:

MOUSE_PRESSED:  BUTTON1_DOWN_MASK
MOUSE_PRESSED:  BUTTON1_DOWN_MASK | BUTTON2_DOWN_MASK
MOUSE_RELEASED: BUTTON2_DOWN_MASK
MOUSE_CLICKED:  BUTTON2_DOWN_MASK
MOUSE_RELEASED:
MOUSE_CLICKED:

Если все, что вам нужно, это обнаружить нажатие кнопки 1 (обычно левой кнопкой мыши), то любой из них должен работать:

if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) {
    System.out.println("BUTTON1_MASK");
}

if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0) {
    System.out.println("BUTTON1_DOWN_MASK");
}

Кроме того, вы можете проверить эту версию с открытым исходным кодом InputEvent, который имеет еще несколько полезных комментариев и показывает, что происходит внутри

Как утверждают документы, BUTTON1_MASK а также BUTTON1_DOWN_MASK являются константами-модификаторами, т.е. они используются в сочетании с MouseEvent#getModifiers, Они не расширяются, а используются как значения маски, например

@Override
public void mousePressed(MouseEvent me) {
 if ((me.getModifiers() & InputEvent.BUTTON1_MASK) == InputEvent.BUTTON1_MASK) {
      System.out.println("Left button pressed.");
    }
}

BUTTON1_DOWN_MASK используется для определения состояния кнопки мыши, тогда как BUTTON1_MASK просто помогает определить, какая кнопка нажата.

Другие вопросы по тегам