Java-绑定可用操作

时间:2018-07-05 15:43:28

标签: java javafx bind pow bidirectional

我想通过求幂绑定两个DoubleProperties。那就是我想做的事情:

val1.bindBidirectional(2^val2);

这似乎是不可能的(请参阅docs)。为什么会这样?获得相同结果的最佳方法是什么?是否以一种聪明的方式制作了两个ChangeListener

谢谢

1 个答案:

答案 0 :(得分:0)

Bindings类提供了几种有用的方法来完成此任务。其中一种方法是createDoubleBinding()方法,它允许您定义自己的绑定代码。

您要做的是使用val1方法绑定Math.pow()来计算幂。 Math.pow()接受两个参数:功率因数和对其应用的值:

val1.bind(Bindings.createDoubleBinding(() ->
                Math.pow(2, val1.get()), val1));

以下是演示该概念的MCVE:

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

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()), val1, factor));

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

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

在创建绑定时,必须注意createDoubleBinding()接受一个varargs参数,该参数允许您指定绑定依赖的所有Observable对象。在您的情况下,它只是val2,但在上面的示例中,我还传递了一个factor属性。

仅当一个或多个相关属性发生更改时,绑定值才会更新。

非常感谢VeeArr在开发此答案时为solve my own issue提供了帮助!