Eclipse RCP应用程序中数据绑定列表的最佳实践

Fri*_*ike 6 java eclipse data-binding jface eclipse-rcp

我无法理解Eclipse RCP应用程序中的数据绑定.我只是无法弄清楚它应该如何工作..

这就是我想要做的

我有一个视图,其中应显示文本列表.文本被"存储"在一个简单的文本中List<String>,通过单例提供(仅用于演示目的;)).所以无论谁使用ListProvider遗嘱都会获得文本列表.当列表更改时,我希望我的View自动更新表格内容.

这是我到目前为止所做的

我的列表提供程序Observable将在列表更改时通知观察者.

在我看来,我创建了一个Observer来监视列表提供程序,当通知观察者时,我刷新了我的视图.

代码ListProvider:

public class ListProvider extends Observable {

    private Stack<String> hist;
    private static ListProvider instance;

    // Singleton implementation
    public static ListProvidergetInstance() {
        if (null == instance) {
            instance = new ListProvider
        }
        return instance;
    }

    public void add(String text) {
        if (this.hist.size() == MAX_SIZE) {
            this.hist.remove(MAX_SIZE-1);
        }
        this.hist.add(0, text);
        // notify all observers
        this.setChanged();
        this.notifyObservers();
    }
}
Run Code Online (Sandbox Code Playgroud)

视图代码:

public class TestView extends ViewPart {

private TableViewer viewer;

[...]

class ViewContentProvider implements IStructuredContentProvider {
    public void inputChanged(Viewer v, Object oldInput, Object newInput) {
    }
    public void dispose() {
    }
    public Object[] getElements(Object parent) {
        return ClipboardHistory.getInstance().getList().toArray();
    }
}

public void createPartControl(Composite parent) {
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    IContentProvider contentProvider = new ViewContentProvider();
    viewer.setContentProvider(contentProvider);
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setInput(getViewSite());

    Observer listObserver = new Observer() {
        @Override
        public void update(Observable o, Object arg) {
            // update the table viewer
            viewer.refresh();
        }
    };

    ListProvider.getInstance().addObserver(listObserver);
}
}
Run Code Online (Sandbox Code Playgroud)

使用ObserverObservable"正确"的方式去或我错过了什么?我不确定我是否已经掌握了RCP数据绑定的概念......

mau*_*yes 6

我建议你阅读JFace数据绑定并使用ViewerSupport,ObservableListContentProviderBeanProperties简化工作.

您还可以看到一个工作示例JFace Databinding Snippet:Model to TableViewer绑定作为参考,其中绑定最后在以下帮助下完成ViewerSupport:

(...)
TableViewer peopleViewer = new TableViewer(committers);
ViewerSupport.bind(peopleViewer, new WritableList(viewModel.getPeople(),
     Person.class), BeanProperties.value(Person.class, "name"));
Run Code Online (Sandbox Code Playgroud)

使用这些帮助程序,您不需要Observer为列表实现,如果您希望查看器在修改数据时更新其标签,请查看相同的示例PropertyChangeSupport,这样您就可以在任何更改时刷新查看器您通过它通知的列表元素.BeanProperties用于绑定很重要.