3

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

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

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

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

4

5 回答 5

2

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

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

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

所以为了测试,我建议你应该在没有任何参数的情况下调用 refresh() ,尝试,它是否有效,如果有效,然后尝试找出与你的应用程序一起工作的最具体的节点。

于 2011-10-05T06:06:25.837 回答
1

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

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

还有一个 syncExec() 方法。

希望这可以帮助!

于 2011-10-27T08:46:11.990 回答
0

您是否在 TreeViewer 上应用了标签装饰器?

我只是在我的 TreeViewer 中编辑了一个条目,而没有之前应用的 LabelDecorator 并且 update(selectedItem, null) 实际上应用了更新(它之前什么也没做)。

也许这是一个jface错误?

[编辑] 似乎您必须使用DecoratingLabelProvider 对象中的updateLabel()

于 2011-12-12T01:02:53.527 回答
0

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

于 2012-02-15T16:37:37.413 回答
0

对我来说,add()、update() 或 remove() 函数工作得相当不错,当然手动这样做很烦人……但如果你从模型中调用它们进行更改,它应该可以正常工作。

于 2019-06-28T10:36:00.490 回答