当前位置: 首页 > 知识库问答 >
问题:

在基础模型更改后更新JFace TreeViewer

浦出野
2023-03-14

我的视图中有一个树查看器,它从标准的Ecore编辑器中监听EMF模型,并用它做进一步的事情。我已经注册了一个选择监听器,它检查所选元素是否是树查看器需要作为输入的类型。因此,问题是,如果模型中有任何变化(例如,向现有元素添加新元素或新信息等),树查看器仅在用户更改选择时才显示更改后的模型,即单击任何模型元素等。

但是我需要做的是,如果底层模型发生变化,树查看器将直接得到通知,并显示新的模型元素,而不必单击模型来监听它。

我找到了下面的eclipse角文章(https://www.eclipse.org/articles/article-treeviewer/treeviewerarticle.htm#inputChanged),从“response th change”中可以看出,inputChanged()和refresh()方法可能是我正在寻找的解决方案,不是吗?

不过,我想知道是否有一种更简单的方法来做到这一点,而不必改变模型代码,但只需改变UI代码?谢了!

共有1个答案

董同
2023-03-14

您可以调用TreeViewerrefresh()方法来刷新模型中的整个树,或者调用refresh(Object)来刷新从给定模型对象开始的树。

如果树结构没有改变,可以调用update(Object)来更新单个对象的显示。

还有addremove方法,用于在模型树中添加和移除对象。

有些方法还有object[]变体,因此可以同时修改多个对象。

更新:

您的模型应该支持生成内容提供者可以监听的模型更改事件。您可以在content providerInputChanged方法中设置此侦听器,并在Dispose方法中删除它。当收到模型更改事件时,使用各种TreeViewer方法更新树。

class TaskListContentProvider 
      implements IStructuredContentProvider, IResourceChangeListener 
{
  private TableViewer viewer;

  private IResource input;

  ... other methods ....

  public void dispose() {
    if (input != null) {
        input.getWorkspace().removeResourceChangeListener(this);
        input = null;
    }
  }


  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    if (input != null) {
        input.getWorkspace().removeResourceChangeListener(this);
    }

    input = (IResource) newInput;

    if (input != null) {
        input.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
    }

    viewer = (TableViewer) viewer;
  }

  public void resourceChanged(IResourceChangeEvent event) {

    ... use resource change event to update viewer
  }
}

 类似资料:
  • 问题内容: 我正在尝试使用包含Latex样式方程式的AngularJS双向绑定文本。我想调用MathJax格式化方程式,但是我不确定在AngularJS完成更改模型后确保调用MathJax的最佳方法。我想我需要回调。这是我的JavaScript: } 这是我的HTML: 小提琴在这里:http : //jsfiddle.net/LukasHalim/UVjTD/1/。您会注意到,即使您单击两次更新

  • 问题内容: 我正在尝试编写一些搜索输入,以使用ngResource从数据库中获取数据。 数据在页面上显示为ng-repeat,但是当我执行搜索并且$ scope已更新时,该视图未更新并显示旧数据。 这是代码: main.html(活动视图) main.js searchbar.js 当它启动时,它从数据库中获取所有数据并正确显示它们,当我尝试进行搜索时,$ scope.eventi会更新(我可以从

  • 问题内容: 我正在尝试使用bootstrapscollspy突出显示由角度中继器生成的列表项。 我遇到的问题是,我在Angle将模型更改应用到视图之前,正在从angular控制器刷新scrollspy插件。 确保DOM本身已更新(不仅仅是角度模型)之后,确保scrollspy(’refresh’)调用发生的角度方法是什么? 模板: 控制器: 问题答案: 我如何使用Blesh的答案解决此问题 模板:

  • 问题内容: 我试图弄清楚Angular的工作原理,并在模型更改时无法更新视图。 的HTML JS http://jsfiddle.net/N2G7z/ 有任何想法吗? 问题答案: 正如上面提到的Ajay beniwal一样,您需要使用Apply来开始消化。

  • 我使用的是一个由渲染器对象的ObservableList支持的TableView,其设置如下: 渲染器对象非常简单,如下所示: 我有一个从UI调用的函数,通过按下按钮并包含以下内容: 我原本希望每3秒钟在每一行上看到一次对approved的更改,但它会执行所有行,并且只有在这之后才会更新UI。为什么会这样?如何更新UI?

  • 我尝试重新验证()和重新绘制(),但没有改变。 现在有趣的事情来了。如果我用for(int I=0;I 只有当我用另一个我手动填写的列表创建和设置新模型时,我才能查看更新。