簡體   English   中英

如何跟蹤由子控件制作的SWT復合鼠標?

[英]How to track mouse over SWT composite made from sub controls?

我創建了自己的控件:

我的復合材料的截圖

我想跟蹤鼠標並添加了MouseTrackListener 不幸的是,當鼠標移動到我的復合部分(即標簽和按鈕)上時,也會生成MouseEnterMouseLeave事件。

在此輸入圖像描述

[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

如何將復合材料作為一個完整的東西而不是子零件進行跟蹤?

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

如果只想獲取鼠標移動事件,可以向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實例或其任何子項上發生的事件。

第三種選擇是使用Composite.setCapture在鼠標進入Composite區域時獲取所有鼠標事件,並在離開時停止捕獲。

其中我認為第一種選擇可能是最好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM