【问题标题】:Adding a listener to the Shell for SWT.MouseUp doesn't work向 SWT.MouseUp 的 Shell 添加侦听器不起作用
【发布时间】:2010-12-28 07:59:57
【问题描述】:

我在 SWT.MouseUp 和 SWT.MouseDown 事件上为 Shell 附加了一个侦听器,但 handleEvent 方法从未被触发。我尝试单击窗口上的许多地方,但它甚至没有到达下面代码中的 System.out.println(..)...

你发现这里有什么错误吗?

谢谢!

//c is a Composite.

final Listener l = new Listener(){
public void handleEvent(Event event) {
System.out.println("Got event. "+event);
Rectangle rect = c.getBounds();
if (rect.contains(event.x, event.y)){
    if((Boolean)c.getData("selected")){
        c.setData("selected", Boolean.FALSE);
    }else{
        c.setData("selected", Boolean.TRUE);
    }
}
}
};
c.getShell().addListener(SWT.MouseUp, l);
c.getShell().addListener(SWT.MouseDown, l);

(此组合位于使用 Forms Toolkit 的 Eclipse 编辑器中)

问候,

-Pradyumna

【问题讨论】:

    标签: swt mouseevent listener


    【解决方案1】:

    通过写作

    c.getShell().addListener(SWT.MouseUp, l);
    c.getShell().addListener(SWT.MouseDown, l);
    

    您将侦听器添加到外壳!单击 shell 的子级不会触发 c.getShell() 的事件。尝试在窗口边界附近单击并注意您的跟踪消息。

    如果您想获取点击c 的事件,您必须通过c.addListener(.) 将监听器添加到c。如果您这样做,您将不需要条件rect.contains(event.x, event.y),因为您知道点击发生在 c 上。

    【讨论】:

    • 谢谢。我现在明白了.. 但是有没有一种方法可以将侦听器连接到复合材料,当事件(例如 MouseDown)在复合材料的任何后代上发生时触发?
    • 您可以遍历组合的 getChildren() 并向每个组合添加侦听器。
    • 值得一提的可能是Display.addFilter(.):您会收到有关显示器事件循环中任何事件的通知。这不是您要问的问题,在大多数情况下这不是正确的做事方式,但在极少数情况下它真的很方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2014-01-30
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2014-02-08
    相关资源
    最近更新 更多