我有一个主要由TreeViewer组成的JFace编辑器。它连接到一个ContentOutlinePage,使大纲视图变得生动起来。
当其中一个接收到SelectionChangedEvent时,它们会调用另一个setSelection()方法...这就是问题所在。setSelection()生成另一个SelectionChangedEvent ...因此无限循环被连接起来。
是否有一种方法可以判断SelectionChangedEvent是否是由实际的用户交互创建的,而不是由另一个调用setSelection()的对象创建的
还有没有更好的方法来阻止这种致命的拥抱?
欢迎提供线索。
发布于 2009-01-28 16:07:27
通常,您将检查例程开头的标志,以检查您是否处于事件处理程序的中间。如果设置了该标志,则退出而不进行处理。
如果未设置该标志,则设置该标志、处理,然后重新设置该标志。
发布于 2009-02-13 08:08:13
另一种有效的模式是删除事件侦听器,进行选择,然后再次添加事件侦听器。这确保了在代码中有一个地方你必须担心这个问题--使用一个标志,你必须同时维护两个地方。
此外,SelectionChangedChanged可能(虽然不确定)放在事件堆栈的顶部(即异步执行)。在这种情况下,还可以最小化查看器不传播通知的时间段。
总体而言,无论鼠标是否被单击,生成的SelectionChangedEvent都是相同的,这让我感到失望。我想要做到这一点并不像人们希望的那样容易。我有一次不得不修改一个文本编辑器类的行为,使其具有两种新的插入事件(用户生成和网络生成),以便共享该文本编辑器类。我希望看到更多关于这方面的讨论。
https://stackoverflow.com/questions/488190
复制相似问题