【问题标题】:Why are the coordinates of a MouseDown event different from a MenuDetect event?为什么 MouseDown 事件的坐标与 MenuDetect 事件的坐标不同?
【发布时间】:2016-04-12 17:54:27
【问题描述】:

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

【问题讨论】:

    标签: java events swt


    【解决方案1】:

    他们是否在计算来自不同来源的 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

    widget-relative,鼠标按钮按下或释放时指针的 x 坐标

    MenuDetectEvent Javadoc:

    public int x

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

    【讨论】:

    • 谢谢!那行得通。一段时间以来,我一直在摸不着头脑。
    • @chama 不客气。在我尝试之前,我不认为它们会有所不同。 Javadoc 很好地解释了它。将其添加到我的答案中。
    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多