我正在尝试检测包含许多其他合成的Composite控件上的单击事件。我试过了:
topComposite.addMouseListener(new MouseListener() {
...
@Override
public void mouseUp(MouseEvent arg0) {
logger.info("HERE");
});
});
但事件永远不会发生。我假设当一个孩子发生鼠标事件时,它会向上传播,但这不会发生。我该怎么做?
答案 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
,请记住再次执行此操作。