如何将值绑定到计算结果?

Zep*_*hyr 1 java javafx

假设我有两个属性,并且我想绑定第三个属性以等于它们之间的计算。

在此示例中,我有 aval1和 afactor属性。我希望该result属性与两者的“幂”绑定:result = Math.pow(factor, val1)

以下 MCVE 显示了我当前如何尝试这样做,但它没有正确绑定。

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;

public class Main {

    private static DoubleProperty val1 = new SimpleDoubleProperty();
    private static DoubleProperty factor = new SimpleDoubleProperty();
    private static DoubleProperty result = new SimpleDoubleProperty();

    public static void main(String[] args) {

        // Set the value to be evaluated
        val1.set(4.0);
        factor.set(2.0);

        // Create the binding to return the result of your calculation
        result.bind(Bindings.createDoubleBinding(() ->
                Math.pow(factor.get(), val1.get())));

        System.out.println(result.get());

        // Change the value for demonstration purposes
        val1.set(6.0);
        System.out.println(result.get());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

16.0
16.0
Run Code Online (Sandbox Code Playgroud)

因此,这似乎最初绑定正确,但当或更改result时不会更新。val1factor

如何正确绑定此计算?

Vee*_*Arr 6

Bindings.createDoubleBinding除了它之外,该方法还采用Callable<Double>一个Observable表示绑定依赖关系的可变参数。仅当列出的依赖项之一发生更改时,绑定才会更新。由于您没有指定任何内容,因此绑定在创建后永远不会更新。

要纠正您的问题,请使用:

result.bind(Bindings.createDoubleBinding(
    () -> Math.pow(factor.get(), val1.get()),
    val1, 
    factor));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我看到它接受可变参数,但无法理解它们的用途。很好的答案。 (2认同)