java - 如何在由子控件制作的 SWT 复合 Material 上跟踪鼠标?

标签 java swt

我创建了自己的控件:

screenshot of my composite

我想跟踪鼠标并添加了一个MouseTrackListener。不幸的是 MouseEnterMouseLeave 事件也会生成,当鼠标移动到我的合成部分(即标签和按钮)上时。

enter image description here

[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 区域时获取所有鼠标事件,并在离开时停止捕获。

在这些之中,我认为第一个选项可能是性能最好的。

关于java - 如何在由子控件制作的 SWT 复合 Material 上跟踪鼠标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16543662/

相关文章:

java - 枚举字符串对象中出现 "cannot be applied to..."错误

java - Spring MVC 中的多数据源切换问题。当第二个数据源不可用时,它会自动使用第一个数据源,其中引用第二个数据源

java - RESTFul 服务器中的多态性

java - 在 Text 组件上绘制轮廓边框

Java:验证 "host:port"并将其转换为 InetSocketAddress 的常用方法?

java - 带页脚的垂直布局?

java - 如何从 MAC OS X 应用程序中的自定义协议(protocol) URL 获取 Java 代码中的 URL 字符串

java - SWT 文本在错误位置换行

java - 添加大量内容时 ScrolledComposite 渲染不正确

java - 如何从基于 SWT 的应用程序打印 SWT 窗口的屏幕