【发布时间】:2017-07-27 19:24:14
【问题描述】:
在其他地方,我查看了 here 和 here,但没有找到我的问题的答案。
一点背景:
- 我正在实现一个表示 Eclipse 项目中资源子集的视图。
- 树中的项目节点将检查项目是否打开以查看它们是否应该包含子项。实际上,Project 节点的
hasChildren()方法返回IProject.isOpen()。 - eclipse 视图订阅resourceChangeEvents,并且在发生任何 更改的情况下,它会在TreeViewer 上调用
refresh()。
基于来自this问题的信息:
如果您在树中添加或删除了对象,请使用
TreeViewer.refresh();
refresh()(不带参数)然后应该遍历并使用来自模型的新信息更新整个树。
通过在代码中设置断点发现,在刷新过程中,框架在一个节点上多次调用hasChildren(),但从不调用getChildren()。
假设Project 当前是打开的,并且在树中代表它的节点扩展了一些子节点。我关闭项目并触发资源更改事件。这会导致refresh()。当被问到时,project 现在从 hasChildren() 返回 false,但孩子仍然存在于树中。
反之,如果项目关闭且节点没有子节点(没有展开箭头),打开项目会触发资源更改事件,其中refresh()es树,项目节点从@987654334返回true @ 和 getChildren() 从来没有被调用来找出这些孩子是什么。该节点仍然没有子节点,也没有展开箭头。
目前,模型会在添加新节点和删除旧节点时触发事件,树会监听这些事件并酌情在 TreeViewer 上调用 add(Object, Object) 和 remove(Object),但模型仅检查其子节点是否需要当通过内容提供者的 getChildren() 方法请求它们时进行更改。
从hasChildren() 调用getChildren() 可以部分缓解该问题,但这似乎很混乱,根据我对 refresh() 工作原理的理解,应该没有必要。
为什么 TreeViewer 的 refresh() 方法不重新查询节点以查看其子节点是什么?鉴于它不这样做,它意味着如何处理添加和删除对象?
【问题讨论】:
-
只有在节点展开时才调用getChildren。它应该仅从 hasChildren 值显示展开/折叠指示器。
-
@greg:这就是我所期望的。然而,尽管有
refresh,展开/折叠指示器并不能反映从hasChildren返回的值。 -
也许您应该向我们展示您的内容提供者的实现,并准确指出设置为观众输入的内容。