【问题标题】:SWT event propagationSWT 事件传播
【发布时间】:2011-11-05 17:56:03
【问题描述】:

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

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

但该事件永远不会触发。我假设当一个鼠标事件发生在一个孩子身上时,它会沿着链条传播,但那并没有发生。我该怎么做?

【问题讨论】:

    标签: java events swt jface


    【解决方案1】:

    在 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 中,如上所示。一个重要的问题是,如果您稍后添加更多 Controls,请记住再次执行此操作。

    【讨论】:

    • 或者,如果您不想添加这么多的侦听器 - 您可以使用解决方法。通过composite.getDisplay().addFilter(SWT.KeyDown, new Listener() {...} 捕获所有发生的 MouseEvents 并以某种方式选择相关事件。
    • @Skip 这确实也是可能的,但要小心再次注销监听器:-)
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多