SWT 事件传播

发布于 2024-12-02 06:05:53 字数 305 浏览 0 评论 0原文

我正在尝试检测包含许多其他组合的组合控件上的单击事件。我尝试过:

topComposite.addMouseListener(new MouseListener() {
        ...
        @Override
        public void mouseUp(MouseEvent arg0) {
            logger.info("HERE");
        });
});

但该事件从未触发。我假设当鼠标事件发生在孩子身上时,它会沿着链向上传播,但这种情况并没有发生。我该怎么做?

I'm trying to detect click events on a Composite control that contains a number of other composites. I tried:

topComposite.addMouseListener(new MouseListener() {
        ...
        @Override
        public void mouseUp(MouseEvent arg0) {
            logger.info("HERE");
        });
});

But the event never fires. I assumed that when a mouse event occurred on a child it would propagate up the chain but that doesn't happen. How do I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冬天旳寂寞 2024-12-09 06:05:53

在 SWT 中,一般规则是事件传播。主要的例外是遍历事件的传播——这很难描述。

问题的简单答案是,您必须将侦听器添加到您的Composite所有子级中 - 递归地

例如,像这样

public void createPartControl(Composite parent) {
    // Create view...

    final MouseListener ma = new MouseAdapter() {
        @Override
        public void mouseDown(MouseEvent e) {
            System.out.println("down in " + e.widget);
        }
    };
    addMouseListener(parent, ma);
}

private void addMouseListener(Control c, MouseListener ma) {
    c.addMouseListener(ma);
    if (c instanceof Composite) {
        for (final Control cc : ((Composite) c).getChildren()) {
            addMouseListener(cc, ma);
        }
    }
}

点击的小部件可以在 e.widget 中找到,如上所示。一个重要的问题是,如果您稍后添加更多控件,请记住再次执行此操作。

In SWT, the general rule is that events do not propagate. The main exception to this, is the propagation of traverse events - which is pretty complicated to describe.

The easy answer to your problem is that you must add the listener to all the children of you Composite - recursively!

E.g. like this

public void createPartControl(Composite parent) {
    // Create view...

    final MouseListener ma = new MouseAdapter() {
        @Override
        public void mouseDown(MouseEvent e) {
            System.out.println("down in " + e.widget);
        }
    };
    addMouseListener(parent, ma);
}

private void addMouseListener(Control c, MouseListener ma) {
    c.addMouseListener(ma);
    if (c instanceof Composite) {
        for (final Control cc : ((Composite) c).getChildren()) {
            addMouseListener(cc, ma);
        }
    }
}

The clicked-upon widget is found in e.widget as seen above. An important issue is to remember to do this again if you add more Controls later.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文