JFace TreeViewer не обновляется при добавлении элемента в модель - PullRequest
0 голосов
/ 24 мая 2019

Я знаю, что у этого есть несколько ответов, но ни один из них не работает для меня.Кроме того, вопросы немного отличаются, потому что я использую собственную реализацию модели.

Этот код показывает, что должно происходить при нажатии кнопки.

Здесь содержимое настроено на просмотрщик дерева:

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 содержит «экземпляры» списка.Эти объекты будут отображаться в TreeViewer.После нажатия кнопки добавления объект добавляется в экземпляры списка.Я хочу видеть это непосредственно в TreeViewer.

Метод inputChanged у ContentProvider пуст.

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);
    }
    ...
}

1 Ответ

0 голосов
/ 24 мая 2019

Прекратить помещать root внутри массива при настройке ввода. Используйте его напрямую.

...