3

我通过添加过滤器在带有复合材料的外壳内捕获鼠标事件。

目前,事件的位置是相对于它们发生的复合材料。
如何检索 MouseEvents 的绝对位置?(绝对位置是显示屏左上角带有 0,0 的位置)。

parentShell.getDisplay().addFilter(SWT.MouseDown, new Listener() {
        @Override
        public void handleEvent(Event event) {
            //do not know the absolute position here
        }
    });
4

4 回答 4

6

您可以使用Control#toDisplay(int, int)转换任何相对坐标来显示相对绝对值。

public void handleEvent(Event event) {
    if (event.widget instanceof Control) {
        Point absolutePos = ((Control) event.widget).toDisplay(event.x, event.y);
        ...
    }
}

如果您收到的事件是鼠标事件(在您的示例中),上述方法将起作用。Display#getCursorLocation()如果您手头没有鼠标事件,您也可以在任何时候使用来获取绝对鼠标位置。

于 2012-11-14T14:37:45.467 回答
5

以下拯救了我的一天:

System.out.println("Click: " + parentShell.getDisplay().getCursorLocation());
于 2012-11-14T14:35:23.697 回答
1

我能想到的唯一方法是使用 getLocation() 方法来获取小部件与侦听器与其父级的相对位置。递归地使用该方法,直到到达顶部复合和/或显示。添加事件的相对坐标以获得绝对坐标。但这只是一个猜测。

于 2012-11-14T14:33:09.637 回答
0

试试这个:

    parentShell.getDisplay().addFilter(SWT.MouseDown, new Listener() {
        @Override
        public void handleEvent(Event event) {
           Point p = Display.getCurrent().map(null, null, event.x, event.y);
        }
    });
于 2012-11-14T14:36:58.723 回答