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中的跨平台鼠标行为?
我相信这种重复使用旗帜是出于历史原因.我只能猜测原始的动机,但可能没有使用过多的位,以便更多的位可用于将来的扩展.另一个可能是Mac只有一只鼠标的事实,因此Mac上通常使用修饰符(并且仍然是)来表示通常在具有足够数量的这些系统上使用不同鼠标按钮的事物.
从Java 1.4开始,我宁愿使用getModifiersEx它来分别报告这些修饰符和按钮.所以信息是可用的,它不会通过旧接口报告,以保持向后兼容性.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |