为什么Java中的所有中间点击报告为具有Alt修饰符?

Joh*_*nyO 12 java mouse swing awt

为什么Java中的MouseEvents在键和鼠标按钮之间共享修饰符?

考虑一下,下面简单的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果在窗口中单击三次(左键单击一次,中键单击一次,右键单击一次),您将看到以下输出.

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
Run Code Online (Sandbox Code Playgroud)

如果你看,你会注意到所有中间点击都被报告为关闭了alt键,并且所有右键点击都被报告为关闭了Meta键.这是有据可查的,并且在Javadocs中甚至有一行提到MouseEvent,提到了这种重叠.但我的问题是,为什么报道这样?从中间点击e.isAltDown()返回true背后的原因是什么?

这使得在某些平台上很难区分Alt + Button1和Button2.

同样,是否有任何"最佳实践"指南用于设计Java中的跨平台鼠标行为?

MvG*_*MvG 7

我相信这种重复使用旗帜是出于历史原因.我只能猜测原始的动机,但可能没有使用过多的位,以便更多的位可用于将来的扩展.另一个可能是Mac只有一只鼠标的事实,因此Mac上通常使用修饰符(并且仍然是)来表示通常在具有足够数量的这些系统上使用不同鼠标按钮的事物.

从Java 1.4开始,我宁愿使用getModifiersEx它来分别报告这些修饰符和按钮.所以信息是可用的,它不会通过旧接口报告,以保持向后兼容性.