簡體   English   中英

如何在復合材料上跟蹤鼠標EXIT / ENTER / HOVER?

[英]How to track mouse EXIT/ENTER/HOVER over composite?

下面的代碼顯示:

1)復合完全忽略了HOVER。 如何啟用?

2)跟蹤ENTER / EXIT,但當鼠標進入子控制區域時,父復合接收EXIT事件。 如何使復合材料的這個中心區域成為復合材料?

public class TryHover {

    public static void main(String[] args) {

        Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        Composite composite = new Composite(shell, SWT.BORDER);
        composite.setLayout(new GridLayout(1, false));

        Label label1 = new Label(composite, SWT.BORDER);
        label1.setText("Label 1");

        Label label2 = new Label(composite, SWT.BORDER);
        label2.setText("Label 2");

        composite.addListener(SWT.MouseEnter, new Listener() {

            @Override
            public void handleEvent(Event event) {
                System.out.println("ENTER");

            }
        });

        composite.addListener(SWT.MouseExit, new Listener() {

            @Override
            public void handleEvent(Event event) {
                System.out.println("EXIT");

            }
        });

        composite.addListener(SWT.MouseHover, new Listener() {

            @Override
            public void handleEvent(Event event) {
                System.out.println("HOVER");

            }
        });

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

    }
}

UPDATE

是的,同意,如果鼠標很慢,它也會產生HOVER。

然后問題是關於ENTER / EXIT:如何關閉子控件的EXIT?

SWT.MouseHover僅在鼠標位於Composite上方時觸發,並且不會移動幾分之一秒。

鼠標在Composite上的每次移動都會觸發SWT.MouseMove

所以這真的取決於你想要達到的目標。


至於問題的第二部分:SWT不會在窗口小部件層次結構中傳播事件(有一些例外)。

但是,您可以實現自己的邏輯來確定何時收聽事件。

  • 對於SWT.MouseExit :獲取鼠標的坐標並檢查是否有任何子項包含鼠標。 如果是這樣,什么都不做,如果沒有,你就離開了Composite
  • 對於SWT.MouseEnter :這有點棘手。 我想出了一個解決方案,它使用顯示屏上的過濾器跟蹤鼠標移動的當前Widget 輸入Composite ,可以檢查上一個窗口小部件是否為子項。 如果是這樣,什么也不做。

private static Widget mouseControl = null;

public static void main(String[] args)
{
    Display display = new Display();

    /* Overall, keep track of the Widget the mouse is moving over */
    display.addFilter(SWT.MouseMove, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            mouseControl = e.widget;
        }
    });

    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final Composite composite = new Composite(shell, SWT.BORDER);
    composite.setLayout(new GridLayout(1, false));

    Label label1 = new Label(composite, SWT.BORDER);
    label1.setText("Label 1");

    Label label2 = new Label(composite, SWT.BORDER);
    label2.setText("Label 2");

    composite.addListener(SWT.MouseEnter, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            /* Check if the mouse was previously moving over a child (you could
             * even do recursive search here) */
            for (Control child : composite.getChildren())
            {
                if (child.equals(mouseControl))
                    return;
            }
            System.out.println("ENTER");
        }
    });

    composite.addListener(SWT.MouseExit, new Listener()
    {
        @Override
        public void handleEvent(Event event)
        {
            /* Check if the mouse is now located over a child (you could
             * even do recursive search here) */
            for (Control child : composite.getChildren())
            {
                if (child.getBounds().contains(new Point(event.x, event.y)))
                    return;
            }
            System.out.println("EXIT");
        }
    });

    composite.addListener(SWT.MouseHover, new Listener()
    {

        @Override
        public void handleEvent(Event event)
        {
            System.out.println("HOVER");
        }
    });

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

不確定,為什么Hover會被你忽略。 我可以看到,它被跟蹤(請參見屏幕截圖),鼠標停留在復合材料上至少一秒鍾。 您的代碼未經任何修改即可使用。

在此輸入圖像描述

可能它與OS有某種關系? 嘗試調用composite.setEnabled(true); 因為禁用的控件不會收到鼠標事件。

暫無
暫無

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

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