Я знаю, что у этого есть несколько ответов, но ни один из них не работает для меня.Кроме того, вопросы немного отличаются, потому что я использую собственную реализацию модели.
Этот код показывает, что должно происходить при нажатии кнопки.
Здесь содержимое настроено на просмотрщик дерева:
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);
}
...
}