MouseDragged не возвращает соответствующую кнопку вниз

Как узнать кнопку, нажатую из события mouseDragged?

У меня проблема в mouseDragged(), потому что полученный MouseEvent возвращает 0 для getButton(). У меня нет проблем с расположением мыши или даже с обнаружением щелчков мыши. Событие mouseClicked() возвращает соответствующую кнопку для getButton().

Любые предложения о том, как я могу это сделать? Я предполагаю, что я мог бы работать с использованием mouseClicked или mousePressed, но я бы предпочел сохранить все это в mouseDragged.

Спасибо за ваше время и ответы.

Ответ 1

Как указано в комментариях и других ответах, SwingUtilities предоставляет три метода для таких случаев, которые должны работать для всех MouseEvents:

SwingUtilities.isLeftMouseButton(aMouseEvent);
SwingUtilities.isRightMouseButton(aMouseEvent);
SwingUtilities.isMiddleMouseButton(aMouseEvent);

Что касается проблемы с вашим подходом, javadoc getButton() говорит:

Возвращает, какие кнопки кнопок мыши изменились.

Так как состояние кнопки не изменяется во время ее удержания, getButton() обычно возвращает NO_BUTTON в mouseDragged. Чтобы проверить состояние кнопок и модификаторов, таких как Ctrl, Alt и т.д. В mouseDragged, вы можете использовать getModifiersEx(). Например, приведенный ниже код проверяет, что BUTTON1 выключен, но BUTTON2 не указан:

int b1 = MouseEvent.BUTTON1_DOWN_MASK;
int b2 = MouseEvent.BUTTON2_DOWN_MASK;
if ((e.getModifiersEx() & (b1 | b2)) == b1) {
    // ...
}

Ответ 2

Якоб правильно, что getButton() не дает вам кнопку по дизайну. Тем не менее, я нашел более чистое решение, чем бит-операции на getModifiersEx(), которое вы также можете использовать в mouseDragged:

if (SwingUtilities.isLeftMouseButton(theMouseEvent)) {
    //do something
}

Аналогичные методы существуют для средней кнопки и правой кнопки.

Ответ 3

int currentMouseButton = -1;
@Override
public void mousePressed(MouseEvent e) {
    currentMouseButton = e.getButton();
}

@Override
public void mouseReleased(MouseEvent e) {
    currentMouseButton = -1;
}

@Override
public void mouseDragged(MouseEvent e) {
    if (currentMouseButton == 3) {
        System.out.println("right button");
    }
}

Ответ 4

Возможно, это проблема с вашей песочницей java.

Следующий код работает хорошо все время (почти, как вы можете видеть).

@Override
public void mouseDragged(MouseEvent e) {
    e.getButton();
}

Попробуйте код на другой машине.