【问题标题】: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 都是相同的,这让我感到失望。我想这并不像人们希望的那样容易。我曾经不得不修改一个文本编辑器类的行为,以便它新增两种插入事件(用户生成和网络生成),以使该文本编辑器类共享。我希望看到更多关于此的讨论。