为了理解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小部件,xText
和yText
,它们绑定到这个对象:
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,这会在模型中设置y
和x
。但是, xText
未更新。为什么是这样? firePropertyChange()
来电不应该安排更新文本吗?
谢谢, 格雷厄姆。
答案 0 :(得分:0)
编译器正在优化this.x
和this.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); } 击>
(见评论;-))