为什么MouseDown事件的坐标与MenuDetect事件不同?

时间:2016-04-12 17:54:27

标签: java events swt

背景:我正在尝试以编程方式在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吗?

1 个答案:

答案 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)会做相反的事情。

供参考:

MouseEvent Javadoc

  

public int x

     

小部件相对,按下或释放鼠标按钮时指针的x坐标

MenuDetectEvent Javadoc

  

public int x

     

上下文菜单触发发生时指针的显示相对 x坐标。