Java 为什么MouseDown事件的坐标与MenuDetect事件的坐标不同?
背景:我试图通过编程在SWT表上创建上下文菜单。我是以编程方式这样做的,因为我需要基于单击的单元格而不是行项目隐藏/显示菜单 我计划使用Event类中的x,y坐标来查找单击的单元格,因此我捕获了非类型化的MouseDown事件和非类型化的MenuDetect事件。我将日志消息放入事件处理程序,以便更好地了解发生了什么。这是我的密码:Java 为什么MouseDown事件的坐标与MenuDetect事件的坐标不同?,java,events,swt,Java,Events,Swt,背景:我试图通过编程在SWT表上创建上下文菜单。我是以编程方式这样做的,因为我需要基于单击的单元格而不是行项目隐藏/显示菜单 我计划使用Event类中的x,y坐标来查找单击的单元格,因此我捕获了非类型化的MouseDown事件和非类型化的MenuDetect事件。我将日志消息放入事件处理程序,以便更好地了解发生了什么。这是我的密码: tree.addListener(SWT.MouseDown, new Listener() { @Override pub
tree.addListener(SWT.MouseDown, new Listener() {
@Override
public void handleEvent(final Event event) {
System.out.println("Mouse down: (" + event.x + ", " + event.y + ")");
handleMouseDown(event);
}
});
tree.addListener(SWT.MenuDetect, new Listener() {
@Override
public void handleEvent(final Event event) {
System.out.println("Menu Detect: (" + event.x + ", " + event.y + ")");
handleMenuDetect(event);
}
});
通过相同的单击,我希望看到相同的结果,但是,当我单击一列单元格时,我的输出如下所示:
鼠标按下:(334,11)菜单检测:(1270255)
鼠标按下:(331,37)菜单检测:(1267281)
鼠标按下:(329,55)菜单检测:(1265299)
鼠标按下:(32477)菜单检测:(1260321)
鼠标按下:(324100)菜单检测:(1260344)
这是怎么回事?它们不是指同一个确切的点吗?他们是从不同的原点计算x,y吗
他们是从不同的原点计算x,y吗
是的,有
SWT.MenuDetect
事件位置是基于整个屏幕的鼠标位置,而SWT.MouseDown
事件位置是基于其组合
这意味着一个告诉您事件在屏幕上发生的位置,而另一个告诉您事件在小部件中发生的位置
要使它们使用相同的坐标系(小部件的系统),请调用Control\35tocontrol(int,int)
对其进行映射
tree.addListener(SWT.MouseDown, (e) -> {
System.out.println(new Point(e.x, e.y));
});
tree.addListener(SWT.MenuDetect, (e) -> {
System.out.println(tree.toControl(e.x, e.y));
});
Control#toDisplay(int,int)
的作用正好相反
供参考: :
public int x
按下或释放鼠标按钮时指针的相对x坐标
:
public int x
显示上下文菜单触发时指针的相对坐标
谢谢成功了。我已经为这件事挠头好一阵子了。@chama,不客气。在我尝试之前,我认为他们不会有什么不同。Javadoc对此进行了很好的解释。把它加到我的答案里。