6

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していますか、それとも何か不足していますか? ObservableRCP Databinding の概念を理解しているかどうかはわかりません...

4

2 に答える 2

1

1つの例外を除いて、あなたのアプローチに問題はないと思います。ビューアーが UI スレッドで更新されていることを確認する必要があります。

Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
        viewer.refresh();
    }
});

ただし、テーブルの更新をより効率的にするためにできることがあります。上記のコードでは、テーブルの上部に 1 つの項目のみを追加しているように見えるため、次の呼び出しを使用することをお勧めします。

viewer.insert( text, 0 );
于 2013-07-12T08:22:56.927 に答える