向 SWT.MouseUp 的 Shell 添加侦听器不起作用

Posted

技术标签:

【中文标题】向 SWT.MouseUp 的 Shell 添加侦听器不起作用【英文标题】:Adding a listener to the Shell for SWT.MouseUp doesn't work 【发布时间】: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

【问题讨论】:

【参考方案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(.):您会收到有关显示器事件循环中任何事件的通知。这不是您要问的问题,在大多数情况下这不是正确的做事方式,但在极少数情况下它真的很方便。

以上是关于向 SWT.MouseUp 的 Shell 添加侦听器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

sh 用于向yaml文件添加定义的Shell脚本

如何向 Xamarin Forms App Shell Tabbar 添加顶部边框

请问hbase shell中向一个已创建的表中添加一个列族该怎么办呢?

Linux 网络侦错:无法联机原因分析

java.lang.RuntimeException: RESTEASY013050: RESTeasy Provider Factory 为空,您是不是配置了 ResteasyBootstrap 侦

linux shell命令向文件内特定的行插入数据,如注释等