Подтвердить что ты не робот

Почему все средние клики в Java представлены как имеющие модификатор Alt?

Почему MouseEvents в Java используют модификаторы между клавишами и кнопками мыши?

Рассмотрим простой код ниже:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(800,600);
    frame.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            System.out.println(e);
        }
    });
    frame.setVisible(true);
}

Если вы нажмете три раза в окне (один щелчок левой кнопкой мыши, один средний щелчок и один щелчок правой кнопкой мыши), вы увидите следующий вывод.

java.awt.event.MouseEvent[MOUSE_CLICKED,(165,149),absolute(165,149),button=1,modifiers=Button1,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(292,228),absolute(292,228),button=2,modifiers=Alt+Button2,clickCount=1] on frame0
java.awt.event.MouseEvent[MOUSE_CLICKED,(293,228),absolute(293,228),button=3,modifiers=Meta+Button3,clickCount=1] on frame0

Если вы посмотрите, вы заметите, что все средние клики сообщаются как имеющие альт-ключ вниз, и все правые клики сообщаются как имеющие мета-ключ вниз. Это хорошо документировано, и в Javadocs для MouseEvent есть даже строка, в которой упоминается это перекрытие. Но мой вопрос в том, почему это так сказано? Какова причина возврата true из e.isAltDown() за средний клик?

Это затрудняет различие между Alt + Button1 и Button2 на некоторых платформах.

Точно так же существуют ли руководства "Лучшие практики" для разработки кросс-платформенного поведения мыши в Java?

4b9b3361

Ответ 1

Я считаю, что повторное использование флагов по историческим причинам. Я могу только догадываться об исходных мотивах, но, возможно, не было слишком много бит, так что для будущих расширений осталось больше бит. Другим может быть тот факт, что у Mac была только одна мышь, поэтому модификаторы (и до сих пор) обычно используются на Mac для обозначения вещей, для которых обычно используется другая кнопка мыши в системах с достаточным количеством этих.

Так как Java 1.4 я бы предпочел использовать getModifiersEx, который будет сообщать об этих модификаторах и кнопках отдельно. Таким образом, информация доступна, она просто не сообщается через старый интерфейс, чтобы поддерживать обратную совместимость.