代码之家  ›  专栏  ›  技术社区  ›  user23743

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

  •  2
  • user23743  · 技术社区  · 14 年前

    为了理解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;
        }
    }
    

    现在在一个单独的类中,我定义了两个文本小部件, 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()));
    

    我发现如果我把文字改成 文本 ,然后按预期自动调用setter,这将同时设置 y x 在模型中。然而, xText公司 未更新 . 这是为什么?是不是应该 firePropertyChange() 打电话安排更新文字?

    谢谢, 格雷厄姆。

    2 回复  |  直到 14 年前
        1
  •  0
  •   user23743user23743    14 年前

    编译器正在优化 this.x this.y ,导致 PropertyChangeSupport 实例以放弃更改通知。它认为没有什么变化。如果我引入这样的临时变量:

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

    然后通知就如我所料发生了。

        2
  •  -1
  •   Andreas Dolk    14 年前

    我想是因为你 this.x 在你的事件被正确更新之前。

    试试这个:

    公共void setX(双x){ this.x=x;//更新模型! propertyChangeSupport.firePropertyChange(“x”,this.x,x); }

    (见注释;—)