使用Comboviewer进行JFace数据绑定

时间:2012-10-26 14:33:41

标签: java data-binding jface

我想为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而不是Viewer,那么就有一个正确的初始选择(参见第二个片段中的注释行)!但是如果我从CCombo框中选择任何其他项目,模型的值就不会改变!

1 个答案:

答案 0 :(得分: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);