2011-10-04 25 views
2

我有一个应用程序使用JFace TreeViewer。我把它连接到ContentProvider。大多数情况下,它的效果很好。但是,对于某些操作,如在节点列表中间添加节点或更改应更改节点标签的值,则refresh()调用不起作用。我试过包括父节点,对标签更新说“真”。什么都不是一直都有效。如何让SWT中的TreeViewer正确刷新?

我已经看到,如果我离开一个可折叠的节点关闭,添加,然后展开,所添加的节点所示。但是,如果它已经扩大,没有显示变化。如果我将我的树信息保存到磁盘并查看,则会进行更改。这只是TreeViewer刷新不起作用。

我查看了我的ContentProvider中的inputChanged方法,但它仅在我的应用程序执行的开始和结束时调用。

任何人都可以帮忙吗?我读过所有的网页,甚至暗示一个答案,没有任何工作。

+1

TreeViewer不是没有bug的,所以有可能你正在碰到一个bug。如果您提供可用于重现问题的短代码片段,我可以看到问题所在。 –

回答

0

不幸的是,我找不到解决这个问题。我最终关闭了文件并重新打开它,强制执行“刷新/更新”。感谢所有的建议。

2

的把inputChanged()如果ContentProvider的不应该刷新期间被称为() - 当一个setInput设置()调用到树查看器使其只叫。

在最坏的情况下,你可以调用setInput设置()与原来的输入,让您神清气爽的元素,但它可以为您的应用程序太慢。

基本上,当您在组中间添加新节点时,必须刷新父节点(使用getChildren()调用返回添加的元素的节点)或其父节点之一。基本上调用不带任何参数的refresh()可能会出于这个原因。因此,为了测试,我建议您应该在不带任何参数的情况下调用refresh()方法,尝试它是否有效,如果有效,然后尝试找出与您的应用程序配合使用的最具体的节点。

+0

感谢您的回复。我曾尝试刷新()所有参数组合(无,父节点,布尔),它不起作用。我按照你的建议再次尝试setInput()调用,但不幸的是它也没有工作。 – Mark

+0

好吧,如果setInput()不起作用,那么无论您的提供者还是TreeViewer中都存在一个错误。 setInput()应该重新加载整个模型,并重新绘制内容。但遗憾的是我没有任何想法 - 我第二次Danil Nachev关于试图创建一个复制代码片段的评论。 –

1

也许这是显而易见的给你,但你打从UI线程刷新?具体尝试以下内容:

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

还有一个syncExec()方法。

希望这会有所帮助!

0

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

我只是编辑在我的TreeViewer没有我申请之前和更新(将selectedItem,NULL)实际应用的更新LabelDecorator的条目(前什么也没做)。

也许这是一个jface错误?

[编辑]好像你必须使用updateLabel()从DecoratingLabelProvider对象。