swt / jface数据绑定:PojoProperties与PojoObservable

时间:2012-10-12 09:00:35

标签: data-binding jface eclipse-databinding

我正在编写一个JFace对话框,我想使用数据绑定到模型对象。

查看代码我可以看到有时我发现PojoProperties用于构建绑定,而有时则使用PojoObservables

看着Javadoc,我可以读到:

PojoObservables :用于为POJO(普通的旧Java对象)创建 可观察对象 的工厂,它符合具有getter的对象的想法setters但不会在变更时提供属性变更事件。

PojoProperties :用于为POJO(普通旧Java对象)创建 属性 的工厂,它符合具有getter和setter的对象的想法但不会在变更时提供财产变更事件。

同样的问题适用于 BeansObservables BeansProperties

之间存在的差异

(明显的)差异是因为observable允许观察对象而属性允许观察属性,但由于Pojo有一个getter和一个setter用于它的数据,它们之间有什么区别?我应该为我的对话选择哪一个?

以下是代码摘录:

POJO:

public class DataObject {
  private String m_value;
  public String getValue() {
    return m_value;
  }
  public void setValue(String i_value) {
    m_value = i_value;
  }
}

DIALOG(相关部分):

@Override
protected Control createDialogArea(Composite parent) {
    Composite container = (Composite) super.createDialogArea(parent);

    m_combo = new Combo(container, SWT.BORDER);
    m_comboViewer = new ComboViewer(container, SWT.NONE);

}

BINDING(相关部分):

    // using PojoObservable
    IObservableValue observeValue = PojoObservables.observeValue(m_dataObject, "value");
    IObservableValue observeWidget = SWTObservables.observeSelection(m_combo);

    // using PojoProperties
    IObservableValue observeValue = PojoProperties.value("value").observe(m_dataObject);
    IObservableValue observeWidget = ViewerProperties.singleSelection().observe(m_comboViewer);

据我所知,有一次我正在使用一个组合而另一个我正在使用ComboViewer,但我可以从查看器中获取组合,并在需要时以另一种方式绑定...

另外,我可以将两者混合使用,例如将observeValueViewerProperties混合使用吗?

    IObservableValue observeValue = PojoObservables.observeValue(m_dataObject, "value");
    IObservableValue observeWidget = ViewerProperties.singleSelection().observe(m_comboViewer);

2 个答案:

答案 0 :(得分:2)

我和JFace的观众(尤其是ComboViewer)和我一起玩游戏。数据绑定并发现如果我使用

SWTObservables.observeSelection(comboViewer.getCombo());

然后数据绑定无法正常工作。

但是,如果我使用

ViewersObservables.observeSingleSelection(comboViewer);

然后一切都按预期工作。

也许这对我的情况来说是特别的,所以为了更好地概述我将在下面的段落中描述我的设置。

我的modelObject字段名为selectedEntityentities,并将此ComboViewer绑定到modelObject

  • 我想在模型对象中显示所有“实体”,如果我将任何实体添加到modelObject.entities集合中,那么我希望将此实体自动添加到组合中。
  • 如果用户在组合中选择了某个项目,我想自动设置modelObject.selectedEntity
  • 如果我设置modelObject.selectedEntity,我想自动设置组合选择。

源代码可在以下网址找到:https://gist.github.com/3938502

答案 1 :(得分:1)

自Eclipse Mars以来,PojoObservables不赞成使用PojoProperties而BeansObservables不赞成使用BeanProperties,所以现在应该明白应该使用哪一个答案。