SWT事件传播

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

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

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

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

您问题的简单答案是您必须将侦听器添加到您的所有子项中 – 递归

就像这样

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