Java - привязка доступных операций - PullRequest
0 голосов
/ 05 июля 2018

Я хочу связать два DoubleProperties путем возведения в степень. То есть я хочу сделать что-то вроде:

val1.bindBidirectional(2^val2);

Это кажется невозможным (см. документы ). Почему это так и как лучше всего добиться того же результата? Это умный способ сделать два ChangeListener с?

Спасибо

1 Ответ

0 голосов
/ 06 июля 2018

Класс 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 за помощь в решении моего вопроса при разработке этого ответа!

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