【问题标题】:How do you get a TreeViewer in SWT to refresh properly?如何让 SWT 中的 TreeViewer 正确刷新?
【发布时间】:2011-10-04 23:57:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • TreeViewer 并非没有错误,因此您可能遇到错误。如果您提供一个简短的代码 sn-p 可以用来重现问题,我可以看到问题所在。

标签: java eclipse swt jface treeviewer


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复。我曾尝试使用所有参数组合(无、父节点、布尔值)的 refresh(),但它不起作用。我确实按照您的建议再次尝试 setInput() 调用,但不幸的是它也不起作用。
  • 好吧,如果 setInput() 不起作用,那么您的提供程序或 TreeViewer 中可能存在错误。 setInput() 应该重新加载整个模型,并重新绘制内容。但遗憾的是,我不知道 - 我赞同 Danil Nachev 关于尝试创建代码 sn-p 以进行复制的评论。
【解决方案2】:

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

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

还有一个syncExec()方法。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

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

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

    可能是 jface 的错误?

    [edit] 看来您必须使用 DecoratingLabelProvider 对象中的updateLabel()

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多