首页 > 解决方案 > 将元素添加到模型时,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);
    }
    ...
}

标签: javajava-8eclipse-pluginswtjface

解决方案


设置输入时停止放入root数组。直接使用它。


推荐阅读