将ChangeListener附加到多个属性

时间:2017-07-06 12:34:37

标签: javafx javafx-8

我有一个由多个可观察SimpleDoubleProperty组成的模型,我现在有一个程序根据可观察属性的变化运行一个函数。

我现在有一个函数calculateThings,它会在更改时被调用:

public double calculateThings() {
  return getA() + getB() + getC();
}

为了触发该功能,我确实将ChangeListener附加到每个属性:

aProperty().addListener(observable -> calculateThings());
bProperty().addListener(observable -> calculateThings());
cProperty().addListener(observable -> calculateThings());

是否有可能将ChangeListener添加到多个属性以简化更改侦听? Bindings API在这里不合适,计算相当复杂。

喜欢:

commonObservable().addListener(observable -> calculateThings());

1 个答案:

答案 0 :(得分:4)

您可以使用Bindings API进行任意复杂的计算,例如使用自定义绑定:

DoubleBinding computed = new DoubleBinding() {
    {
        super.bind(aProperty, bProperty, cProperty);
    }

    @Override
    public double computeValue() {
        return getA() + getB() + getC() ;
    }
};

或使用Bindings.createXXXBinding(...)实用程序方法:

DoubleBinding computed = Bindings.createDoubleBinding(
    () -> getA() + getB() + getC(),
    aProperty, bProperty, cProperty);

在任何一种情况下,绑定都会在任何绑定属性(示例中的aPropertybPropertycProperty)发生更改时自动更新,您可以绑定到{{ 1}}或以通常的方式添加监听器:

computed