我有一个使用JFace TreeViewer
的应用。我把它连接到ContentProvider
。大多数情况下,它很有效。但是,对于某些操作,例如在节点列表中间添加节点或更改应更改节点标签的值,refresh()
调用不起作用。我尝试过包含父节点,对标签更新说“是”。什么都没有。
我已经看到,如果我关闭可折叠节点并添加然后展开,则会显示添加的节点。但如果它已经扩展,则不会显示任何变化。如果我将树信息保存到磁盘并查看,则进行更改。这只是TreeViewer
刷新无效。
我查看了inputChanged
中的ContentProvider
方法,但只在应用执行的开头和结尾调用。
有人可以帮忙吗?我已经阅读了所有网页,甚至提示答案,但没有任何效果。
答案 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()函数的运行情况相当不错,手动进行此操作当然很烦人……但是,如果您在模型中进行更改时调用它们,则应该可以正常工作