2016-04-12 26 views
2

背景:SWTテーブルにコンテキストメニューをプログラムで作成しようとしています。私は、行の項目ではなく、クリックされたセルに基づいてメニューを非表示にする必要があるため、プログラムで実行しています。MouseDownイベントの座標がMenuDetectイベントと異なるのはなぜですか?

イベントクラスの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を計算していますか?

答えて

2

彼らはx、yを異なる起源から計算していますか?

はい、あります。

SWT.MenuDetectイベント位置は、画面全体に基づくマウス位置ですが、SWT.MouseDownイベント位置は、そのコンポジットに基づいています。

これは、画面上のどこでイベントが発生したのかを表示する一方で、ウィジェットがどこで発生したのかを示します。

同じ座標系(ウィジェットのシステム)を使用するようにするには、Control#toControl(int, int)を呼び出してマップします。


Control#toDisplay(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)); 
}); 

は反対のことを行います。

MouseEvent Javadoc:参考


public int x

ウィジェットに対して、Xマウスボタンが押され又は

解放された時点でポインタの座標

MenuDetectEvent Javadoc

public int x

表示相対 Xコンテキストメニュートリガが発生した時にポインタの座標。

+0

ありがとう!それはうまくいった。私はしばらくこの頭を掻いてきました。 – chama

+0

@chamaようこそ。私は試してみるまで彼らが違うとは思わなかった。 Javadocはそれをうまく説明します。私の答えにそれを加えました。 – Baz

関連する問題