1

我有一个 JFace 编辑器,它主要由TreeViewer. 这与 aContentOutlinePage相关联以使大纲视图栩栩如生。

当任何一个收到 aSelectionChangedEvent时,他们都会调用 othersetSelection()方法……这就是问题所在。setSelection()生成另一个SelectionChangedEvent......因此加入了无限循环。

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

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

欢迎提供线索。

4

2 回答 2

3

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

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

于 2009-01-28T16:07:27.467 回答
0

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

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

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

于 2009-02-13T08:08:13.213 回答