java - 将元素添加到模型时,JFace TreeViewer 不会更新
问题描述
我知道这有几个答案,但没有一个对我有用。问题也有点不同,因为我使用的是我自己的模型实现。
此代码显示了单击按钮时应该发生的情况。
这里的内容设置为树查看器:
root = new TreeRootModel(solverEntries, null, configParser.getConfFile());
root.addInstances(instances);
viewer.setInput(new TreeRootModel[] { root });
column.pack(); // important to see TreeViewer at start
viewer.expandAll();
TreeRootModel 类只是一个存储类,在其下存储一个数组,具有 getter 和 setter。不值得在这里展示。
ToolBar toolBar = new ToolBar(newMainComposite, SWT.FLAT | SWT.WRAP | SWT.RIGHT);
ToolItem addItem = new ToolItem(toolBar, SWT.PUSH);
addItem.setText("Add");
addItem.setImage(addIcon);
addItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
InstanceModel newInstance = new InstanceModel("new Instance", null);
instances.add(newInstance);
// none of these three calls has an effect
viewer.refresh();
tree.update();
column.pack();
}
});
所以 TreeViewer 的内容是 root,而 root 包含 List“实例”。这些对象将显示在 TreeViewer 中。单击添加按钮后,将向 List 实例添加一个对象。我想立即在 TreeViewer 中看到它。
ContentProvider 的 inputChanged 方法为空。
public class GoalInstanceContentProvider implements ITreeContentProvider, IResourceChangeListener {
TreeRootModel root;
ArrayList<InstanceModel> instances = new ArrayList<>();
private TreeViewer viewer;
private TreeRootModel[] input;
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@SuppressWarnings("unchecked")
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof TreeRootModel) {
root = (TreeRootModel) inputElement;
return root.getInstances().toArray();
} else if (inputElement instanceof ArrayList) {
instances = (ArrayList<InstanceModel>) inputElement;
return instances.toArray();
}
return ArrayContentProvider.getInstance().getElements(inputElement);
}
...
}
解决方案
设置输入时停止放入root
数组。直接使用它。
推荐阅读
- node.js - Mongoose 预保存挂钩在文档中设置自动增量 ID
- dependencies - Maven排除传递依赖的依赖
- sql - 从 bat 文件(oracle、批处理)运行 sql 脚本
- javascript - Yet another "Failed to mount component: template or render function not defined" from Vue
- python - Executing Interactive SSH Command via Python script
- iphone - How to upload key card to iOS app and allow students to use it to unlock RFID enabled doors
- javascript - Change style of a particular print page?
- angular - Angular QueryList 更改事件 ExpressionChangedAfterItHasBeenCheckedError
- r - Trying to do sentiment analysis with "afinn" dictionary
- java - 如何在孩子的 pom 中将 jacoco 覆盖率设置为 60%?