12

为什么 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);
}

如果在窗口中单击 3 次(左键单击、中键单击和右键单击),您将看到以下输出。

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

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

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

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

4

1 回答 1

7

我相信这种重新使用标志是出于历史原因。我只能猜测最初的动机,但可能没有使用太多位,以便有更多位可供未来扩展使用。另一个可能是 Mac 只有一个鼠标这一事实,因此修饰符在 Mac 上曾经(现在仍然是)常用来表示在具有足够数量的系统上通常会使用不同鼠标按钮的事物。

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

于 2013-03-06T21:12:55.727 回答