【问题标题】:swt/jface databinding: PojoProperties vs PojoObservableswt/jface 数据绑定:PojoProperties 与 PojoObservable
【发布时间】:2012-10-12 09:00:35
【问题描述】:

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

查看代码我可以看到,有时我会找到用于构建绑定的PojoProperties,而其他时候则使用PojoObservables

查看我可以阅读的 Javadoc:

PojoObservables:为 POJO(普通的旧 Java 对象)创建 可观察对象 的工厂,符合带有 getter 和setter 但不提供更改时的属性更改事件。

PojoProperties:为 POJO(普通的旧 Java 对象)创建 properties 的工厂,符合带有 getter 和 setter 的对象的概念但不提供更改时的属性更改事件。

同样的问题也适用于 BeansObservablesBeansProperties

之间存在的差异

(明显的)区别似乎是 observable 允许观察对象,而 properties 允许观察属性,但是由于 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);

【问题讨论】:

    标签: data-binding jface eclipse-databinding


    【解决方案1】:

    我正在使用 JFace 查看器(尤其是 ComboViewer)和数据绑定,发现如果我使用的话

    SWTObservables.observeSelection(comboViewer.getCombo());
    

    那么数据绑定工作不正常。

    但是,如果我使用

    ViewersObservables.observeSingleSelection(comboViewer);
    

    然后一切都按预期工作。

    也许这是我的特殊情况,所以为了更好地了解它,我将在下面的段落中描述我的设置。

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

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

    源码可以在:https://gist.github.com/3938502

    【讨论】:

      【解决方案2】:

      自 Eclipse Mars 以来,PojoObservables 被弃用,取而代之的是 PojoProperties,而 BeansObservables 被弃用,取而代之的是 BeanProperties,因此现在应该使用哪一个的答案已经很明显了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-11
        • 2011-09-13
        • 2011-02-24
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多