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)
题
使用Observer和Observable"正确"的方式去或我错过了什么?我不确定我是否已经掌握了RCP数据绑定的概念......
我建议你阅读JFace数据绑定并使用ViewerSupport,ObservableListContentProvider并BeanProperties简化工作.
您还可以看到一个工作示例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用于绑定很重要.
| 归档时间: |
|
| 查看次数: |
6164 次 |
| 最近记录: |