背景:我正在尝试以编程方式在SWT表上创建上下文菜单。我是以编程方式进行的,因为我需要根据单击的单元格隐藏/显示菜单,而不是行项目。
我计划使用Event类中的x,y坐标来查找单击的单元格,因此我捕获了无类型的MouseDown事件和无类型的MenuDetect事件。我将日志消息放入事件处理程序中,这样我就能更好地了解发生了什么。这是我的代码:
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)菜单检测:(1270,255)
鼠标按下:(331,37)菜单检测:(1267,281)
鼠标按下:(329,55)菜单检测:(1265,299)
鼠标按下:(324,77)菜单检测:(1260,321)
鼠标按下:(324,100)菜单检测:(1260,344)
这里发生了什么?他们不是指同一个问题吗?他们是在计算不同来源的x,y吗?
答案 0 :(得分:2)
他们是在计算不同来源的x,y吗?
是的,他们这样做。
SWT.MenuDetect
事件位置是基于整个屏幕的鼠标位置,而SWT.MouseDown
事件位置基于其复合。
这意味着一个人告诉你事件发生在屏幕上的哪个位置,而另一个告诉你它在小部件中的位置。
要使它们使用相同的坐标系(小部件的系统),请调用Control#toControl(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
上下文菜单触发发生时指针的显示相对 x坐标。