【问题标题】:What makes a model change get propagated via JFace databinding?是什么让模型更改通过 JFace 数据绑定传播?
【发布时间】:2010-11-15 15:49:34
【问题描述】:

为了了解 JFace 数据绑定的工作原理,我有一个具有两个属性的模型对象。更改一个属性应将另一个属性设置为相同的值:

public class Model {
  private double x;
  private double y;
  private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);

    public void addPropertyChangeListener(String propertyName,
            PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }   

    public void setX(double x) {
        propertyChangeSupport.firePropertyChange("x", this.x, this.x = x);
    }

    public double getX() {
        return x;
    }

    public void setY(double y) {
        propertyChangeSupport.firePropertyChange("y", y, this.y = y);
        setX(y);
    }

    public double y() {
        return y;
    }
}

现在在一个单独的类中,我定义了两个 Text 小部件,xTextyText,它们像这样绑定到这个对象:

    DataBindingContext bindingContext = new DataBindingContext();
    bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(xText),
            BeanProperties.value(HumidityScanParameters.class,"x").observe(getModel()));
    bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(yText),
            BeanProperties.value(HumidityScanParameters.class, "y").observe(getModel()));

我发现如果我更改yText 中的文本,那么setter 会按预期自动调用,这会在模型中同时设置yx。但是,xText 没有更新。为什么是这样? firePropertyChange() 呼叫不应该安排更新文本吗?

谢谢, 格雷厄姆。

【问题讨论】:

    标签: java data-binding jface


    【解决方案1】:

    编译器正在优化 this.xthis.y 的初始值,这导致 PropertyChangeSupport 实例丢弃更改通知。它不认为有什么改变。如果我像这样引入一个临时变量:

    public void setX(double x) {
        double oldValue = this.x;
        this.x = x;
        propertyChangeSupport.firePropertyChange("x", oldValue, x);
    }
    

    然后通知会如我预期的那样发生。

    【讨论】:

      【解决方案2】:

      我猜这是因为您在正确更新之前将this.x 放入您的活动中。

      试试这个:

      公共无效setX(双x){ 这个.x = x; // 更新模型! propertyChangeSupport.firePropertyChange("x", this.x, x); }

      (见 cmets ;-))

      【讨论】:

      • 感谢@Andreas_D,我的理解是 firePropertyChange() 的第二个参数是 old 值,第三个是 new 值。您的版本将两次发送新值...这是预期的吗?
      • 事实上,firePropertyChange() 的文档说,如果新旧值相等且非空,则不会触发任何事件,因此您的源绝对不能满足我的需要。跨度>
      • 啊,混淆代码,你在第三个参数中做了一个字段分配,把我困住了;-) -- 嘿,(-1)是你问题中的代码! ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2018-02-04
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多