Eclipse RCP アプリケーションのデータバインディングを理解できません。私はそれがどのように機能するはずなのか理解できません..
これが私がやりたいことです
テキストのリストを表示するビューがあります。テキストは、シングルトンを介して提供されるシンプルに「保存」されList<String>
ます(デモ目的のみ;))。したがって、 を使用する人は誰でもListProvider
テキストのリストを取得します。リストが変更されると、ビューでテーブルの内容が自動的に更新されます。
これが私がこれまでに行ったことです
マイリストプロバイダーはObservable
、リストが変更されたときにオブザーバーに通知するプロバイダーです。
私のビューでは、リスト プロバイダーを監視するオブザーバーを作成し、オブザーバーに通知されたら、ビューを更新します。
のコード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();
}
}
ビューのコード:
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);
}
}
質問
「正しい」方法を使用Observer
していますか、それとも何か不足していますか? Observable
RCP Databinding の概念を理解しているかどうかはわかりません...