如何让SWT中的TreeViewer正确刷新?

时间:2011-10-04 23:57:58

标签: java eclipse swt jface treeviewer

我有一个使用JFace TreeViewer的应用。我把它连接到ContentProvider。大多数情况下,它很有效。但是,对于某些操作,例如在节点列表中间添加节点或更改应更改节点标签的值,refresh()调用不起作用。我尝试过包含父节点,对标签更新说“是”。什么都没有。

我已经看到,如果我关闭可折叠节点并添加然后展开,则会显示添加的节点。但如果它已经扩展,则不会显示任何变化。如果我将树信息保存到磁盘并查看,则进行更改。这只是TreeViewer刷新无效。

我查看了inputChanged中的ContentProvider方法,但只在应用执行的开头和结尾调用。

有人可以帮忙吗?我已经阅读了所有网页,甚至提示答案,但没有任何效果。

5 个答案:

答案 0 :(得分:2)

inputChanged()如果在refresh()期间不应该调用contentprovider - 只有在对树查看器进行setInput()调用时才会调用它。

在最坏的情况下,您可以使用原始输入调用setInput()以刷新元素,但对于您的应用程序来说可能太慢。

基本上,当您在组的中间添加新节点时,您必须刷新父节点(使用getChildren()调用返回添加元素的节点)或其父节点之一。基本上,调用不带任何参数的refresh()可能会出于这个原因。

因此,对于测试,我建议您应该在没有任何参数的情况下调用refresh(),尝试,是否有效,如果有效,请尝试找出适用于您的应用程序的最具体的节点。

答案 1 :(得分:1)

也许这对您来说很明显,但是您是否正在从UI线程调用刷新?具体尝试以下方法:

Display.getCurrent().asyncExec(new Runnable() {
    @Override
    public void run() {
      // TODO Call refresh() here
    }
});

还有一个syncExec()方法。

希望这有帮助!

答案 2 :(得分:0)

您是否已将标签装饰器应用于TreeViewer?

我刚刚在TreeViewer中编辑了一个没有我之前应用的LabelDecorator的条目,并且更新(selectedItem,null)实际应用了更新(之前没有做任何事情)。

也许这是一个jface bug?

[edit]似乎你必须使用DecoratingLabelProvider对象中的updateLabel()

答案 3 :(得分:0)

不幸的是,我找不到任何解决方法。我最终关闭了文件并重新打开它以强制“刷新/更新”。谢谢大家的建议。

答案 4 :(得分:0)

对我来说,add(),update()或remove()函数的运行情况相当不错,手动进行此操作当然很烦人……但是,如果您在模型中进行更改时调用它们,则应该可以正常工作