SWT事件传播

时间:2011-08-29 03:21:39

标签: java events swt jface

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

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

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

1 个答案:

答案 0 :(得分:11)

在SWT中,一般规则是事件传播。对此的主要例外是遍历事件的传播 - 这个描述非常复杂。

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

E.g。像这样

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,请记住再次执行此操作。