将 ChangeListener 附加到多个属性

pfr*_*ied 4 javafx javafx-8

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

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

public double calculateThings() {
  return getA() + getB() + getC();
}
Run Code Online (Sandbox Code Playgroud)

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

aProperty().addListener(observable -> calculateThings());
bProperty().addListener(observable -> calculateThings());
cProperty().addListener(observable -> calculateThings());
Run Code Online (Sandbox Code Playgroud)

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

喜欢:

commonObservable().addListener(observable -> calculateThings());
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 6

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

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

    @Override
    public double computeValue() {
        return getA() + getB() + getC() ;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

DoubleBinding computed = Bindings.createDoubleBinding(
    () -> getA() + getB() + getC(),
    aProperty, bProperty, cProperty);
Run Code Online (Sandbox Code Playgroud)

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

someDoubleProperty.bind(computed);
computed.addListener((obs, oldComputedValue, newComputedValue) -> {
    /* some code */
});
Run Code Online (Sandbox Code Playgroud)