ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在复合材料上跟踪鼠标EXIT / ENTER / HOVER?

2019-07-03 10:49:49  阅读:145  来源: 互联网

标签:java eclipse-plugin eclipse-rcp swt mouseevent


下面的代码显示:

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:获取鼠标的坐标并检查是否有任何子项包含鼠标.如果是这样,什么都不做,如果没有,你就离开了复合材料.
>对于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,eclipse-plugin,eclipse-rcp,swt,mouseevent
来源: https://codeday.me/bug/20190703/1365839.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有