java - 如何在复合 Material 上跟踪鼠标退出/进入/悬停?

标签 java eclipse-plugin swt eclipse-rcp mouseevent

下面的代码表明:

1) 复合 Material 完全忽略了 HOVER。如何启用?

2) ENTER/EXIT 被跟踪,但是当鼠标进入子控制区域时,父复合体接收 EXIT 事件。如何使复合 Material 的中心区域成为复合 Material 的一部分?

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

    }
}

更新

是的,同意,如果鼠标速度慢,它也会产生 HOVER。

那么问题只是关于进入/退出:如何打开子控件的退出?

最佳答案

SWT.MouseHover 仅当鼠标位于 Composite 上并且在几分之一秒内没有移动时才会触发。

SWT.MouseMove 在鼠标在 Composite 上的每次移动时触发。

所以这真的取决于你想在这里实现什么。


关于问题的第二部分:SWT 不会将事件向上传播到小部件层次结构(有一些异常(exception))。

但是,您可以实现自己的逻辑来确定何时监听事件。

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

关于java - 如何在复合 Material 上跟踪鼠标退出/进入/悬停?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21837250/

相关文章:

java - 如何在 Guice 中为变量设置默认值

java - 将映射映射到包含名称和值参数的对象列表

java - 以编程方式更改 Eclipse 中的文件关联

eclipse - 禁用 MercurialEclipse

java - 如何在swing jframe中嵌入SWT浏览器

java - SWT CTabItem setData 和 setControl 的含义

java - 具有 Eclipse 外观的 Eclipse RCP 工具栏按钮

java - 如何使用 java Jersey 在资源内发出 HTTP 请求?

java - 如何在 TreeViewer 中选择特定节点?

java - 如何更改列表中特定项目的前景色?