【问题标题】:How to tell user events from synthetic events?如何区分用户事件和合成事件?
【发布时间】:2009-01-28 16:02:16
【问题描述】:

我有一个主要由TreeViewer 组成的JFace 编辑器。这已连接到 ContentOutlinePage 以使大纲视图栩栩如生。

当其中任何一个收到SelectionChangedEvent 时,他们会调用其他人的setSelection() 方法......这就是问题所在。 setSelection() 生成另一个 SelectionChangedEvent ... 从而加入了无限循环。

有没有办法判断 SelectionChangedEvent 是由实际用户交互创建的,而不是由另一个调用 setSelection() 的对象创建的?

还有更好的方法来阻止这种致命的拥抱吗?

欢迎提供线索。

【问题讨论】:

    标签: eclipse eclipse-rcp jface eclipse-pde


    【解决方案1】:

    通常,您会在例程开始时检查一个标志,以检查您是否处于事件处理程序的中间。如果设置了标志,那么您将退出而不进行处理。

    如果未设置标志,则设置标志,处理,然后设置标志。

    【讨论】:

      【解决方案2】:

      另一种可行的模式是删除事件侦听器,进行选择,然后再次添加事件侦听器。这确保了代码中只有一个地方您需要担心这一点 - 使用标志您必须同时维护两个地方。

      此外,SelectionChangedChanged 可能(虽然不确定)放在事件堆栈的顶部(即异步执行)。在这种情况下,您还可以最大限度地减少查看器不传播通知的时间。

      总的来说,无论是否单击鼠标,生成的 SelectionChangedEvent 都是相同的,这让我感到失望。我想这并不像人们希望的那样容易。我曾经不得不修改一个文本编辑器类的行为,以便它新增两种插入事件(用户生成和网络生成),以使该文本编辑器类共享。我希望看到更多关于此的讨论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多