SWT事件传播

bco*_*lan 8 java events swt jface

我正在尝试检测包含许多其他复合材料的Composite控件上的单击事件.我试过了:

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

但事件永远不会发生.我假设当一个孩子发生鼠标事件时它会向上传播,但这不会发生.我该怎么做呢?

Ton*_*sen 11

在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

点击的小部件e.widget如上所示.一个重要的问题是如果Controls稍后添加更多,请记住再次执行此操作.

  • 或者,如果您不想添加如此多的侦听器 - 您可以使用变通方法.通过`composite.getDisplay().addFilter(SWT.KeyDown,new Listener(){...}`捕获所有发生的MouseEvents,并以某种方式选择相关事件. (3认同)