什么使模型更改通过JFace数据绑定传播?

时间:2010-11-15 15:49:34

标签: java data-binding jface

为了理解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()来电不应该安排更新文本吗?

谢谢, 格雷厄姆。

2 个答案:

答案 0 :(得分:0)

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

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

然后按照我的预期发生通知。

答案 1 :(得分:-1)

我想这是因为你在事件更新之前将this.x放到了你的事件中。

试试这个:

<击>     public void setX(double x){         this.x = x; //更新模型!         propertyChangeSupport.firePropertyChange(“x”,this.x,x);     }

(见评论;-))