gpt4 book ai didi

java - 在底层模型更改后更新 JFace TreeViewer

转载 作者:行者123 更新时间:2023-11-29 03:23:05 25 4
gpt4 key购买 nike

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

但我需要做的是,如果基础模型发生变化并显示新的模型元素,树查看器会直接收到通知,而无需单击模型来收听它。

我找到了以下 eclipse 角文章 ( https://www.eclipse.org/articles/Article-TreeViewer/TreeViewerArticle.htm#inputChanged ),从“响应变化”看来,inputChanged() 和 refresh() 方法可能是我正在寻找的解决方案,不是吗?

我仍然想知道是否有更简单的方法可以做到这一点而不必更改模型代码,而只需更改 UI 代码?谢谢!

最佳答案

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

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

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

一些方法还有 Object [] 变体,因此您可以一次修改多个对象。

更新:

您的模型应该支持生成内容提供者可以收听的模型更改事件。您可以在内容提供程序 inputChanged 方法中设置此监听器,并在 dispose 方法中将其删除。当收到模型更改事件时,使用各种 TreeViewer 方法来更新树。

Eclipse View 显示工作区中的文件(例如 Navigator View ),这是所有这些如何使用的示例。这些内容提供者使用工作区资源更改监听器 (IResourceChangeListener) 来接收工作区更改的通知,并使用事件中的信息调用我上面列出的方法来更新树。

更新 2:在内容提供程序中使用 IResourceChangeListener 的示例,摘自 org.eclipse.ui.views.tasklist.TaskListContentProvider

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
}
}

关于java - 在底层模型更改后更新 JFace TreeViewer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com