2

ComboViewerにJFaceデータバインディングを使用したいのですが、これを正しく行う方法がわかりません。

それが私の現在の進歩です:

    CCombo c= new CCombo(grpCpu, SWT.BORDER);
    c.setEditable(false);

    ComboViewer c_viewer = new ComboViewer(text_6);
    c_viewer.setContentProvider(new ArrayContentProvider());
    c_viewer.setLabelProvider(new LabelProvider() {

        @Override
        public String getText(Object element) {
            return Activator.getSomeService().key2Value((Integer) element);
        }

    });
    c.setInput(new int[]{1, 2, 3});

key2Valueメソッド(int値を文字列に変換するための単純なマップ):

public String key2Value(int key){
    return someHashMap.get(key);
}

そしてデータバインディング:

// IObservableValue target = SWTObservables.observeSelection(c);
IObservableValue target = ViewersObservables.observeSingleSelection(c_viewer);
IObservableValue model = BeansObservables.observeValue(getInputObject(), "id");
    ctx.bindValue(target, model, null, null);

バインディングはすでに正しく機能しています。UIでの選択が変更されると、モデルの値も変更されます。しかし、最初の選択はありません!

ここで本当に助けが必要です。事前にThx!

ちなみに、ビューアーではなくCComboをバインドすると、正しい初期選択があります(2番目のスニペットのコメント行を参照)。しかし、CComboボックスから他のアイテムを選択しても、モデルの値は変更されません。

4

1 に答える 1

3

さて、私は今それを手に入れました。私のコードはずっと正しかった。しかし、私のモデルがobservableValueを長く維持していることに気づきませんでした。また、ビューア入力はint配列であるため、正しく機能しませんでした。私がしなければならなかったのは、単にカスタムUpdateValueStrategyを書くことでした:

IObservableValue target = ViewersObservables.observeSingleSelection(c_viewer);
IObservableValue model = BeansObservables.observeValue(getInputObject(), "id");

    UpdateValueStrategy u = new UpdateValueStrategy().setConverter(new IConverter() {

        @Override
        public Object getFromType() {
            return long.class;
        }

        @Override
        public Object getToType() {
            return int.class;
        }

        @Override
        public Object convert(Object fromObject) {
            return Integer.parseInt(fromObject.toString());
        }
    });
    ctx.bindValue(target, model, null, u);
于 2012-10-31T15:34:43.463 に答える