Java 为什么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

背景:我试图通过编程在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)菜单检测:(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对此进行了很好的解释。把它加到我的答案里。