4

私は独自のコントロールを作成しました:

私のコンポジットのスクリーンショット

マウスを追跡したいので、MouseTrackListener. 残念ながら、マウスがコンポジットの一部 (ラベルとボタン) の上を移動するMouseEnterと、MouseLeaveイベントも生成されます。

ここに画像の説明を入力

[Mouse enter] - mouse enters the empty space
[Mouse hover] - mouse is over the empty space
[Mouse exit]  - mouse moved over label
[Mouse enter] - mouse leaves label and enters empty space
[Mouse hover] - mouse over empty space
[Mouse exit]  - mouse leaves composite

コンポジットをサブパーツではなく 1 つの完全なものとして追跡するにはどうすればよいですか?

public class MyComposite extends Composite {
    public MyComposite(final Composite parent, final int style) {
        super(parent, style);

        final Label lbl = new Label(this, SWT.NONE);
        lbl.setBounds(10, 10, 78, 15);
        lbl.setText("My Composite");

        final Button btn = new Button(this, SWT.NONE);
        btn.setBounds(190, 29, 75, 25);
        btn.setText("Ok");

        pack();
    }

    public static void main(final String[] args) {
        final Shell shell = new Shell(Display.getDefault());
        shell.setText("Testcase");
        shell.setLayout(new FillLayout());

        final MyComposite comp = new MyComposite(shell, SWT.NONE);
        comp.addMouseTrackListener(new MouseTrackListener() {
            @Override
            public void mouseHover(final MouseEvent e) {
                System.out.println("[Mouse hover]");
            }

            @Override
            public void mouseExit(final MouseEvent e) {
                System.out.println("[Mouse exit]");
            }

            @Override
            public void mouseEnter(final MouseEvent e) {
                System.out.println("[Mouse enter]");
            }
        });

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }
}
4

1 に答える 1

5

マウス移動イベントのみを取得したい場合は、型指定されていないイベントを に追加できますComposite。それは次のようなものでなければなりません

final Composite comp = new Composite(shell, org.eclipse.swt.SWT.NONE);
comp.addListener(SWT.MouseMove, new Listener() {
    public void handleEvent(Event event) {
        System.out.println("hit");
    }
});

のすべての子に同じ Listener インスタンスを追加すると、MyCompositeすべてのマウス移動イベントをキャプチャできます。

または、すべてのマウス イベントをキャッチし、インスタンスまたはその子Display.addFilterで発生するイベントをフィルター処理するために使用できます。Composite

3 番目のオプションはComposite.setCapture、マウスが領域に入ったときにすべてのマウス イベントを取得し、Composite領域を離れたときにキャプチャを停止するために使用することです。

これらのうち、最初のオプションがおそらく最高のパフォーマンスを発揮すると思います。

于 2013-05-14T20:32:55.353 に答える