Что заставляет изменение модели распространяться через привязку данных JFace? - PullRequest
2 голосов
/ 15 ноября 2010

Чтобы понять, как работает привязка данных 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()));

Я обнаружил, что если я изменяю текст в yText, то сеттер автоматически вызывается, как и ожидалось, и в модели устанавливаются y и x Однако xText не обновляется . Почему это? Разве firePropertyChange() не должен организовать обновление текста?

Спасибо, Graham.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2010

Компилятор оптимизировал начальные значения this.x и this.y, что привело к тому, что экземпляр PropertyChangeSupport отклонил уведомление об изменении. Он не думал, что что-то изменилось. Если я введу временную переменную, как это:

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

тогда уведомления появляются, как я и ожидал.

0 голосов
/ 15 ноября 2010

Я полагаю, это потому, что вы добавили this.x к своему событию, прежде чем его правильно обновили.

Попробуйте:

public void setX (double x) {this.x = x;// обновить модель!propertyChangeSupport.firePropertyChange ("x", this.x, x);}

(см. Комментарии ;-))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...