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 に答える