java - 如何创建多级组合绑定(bind)?

标签 java javafx javafx-2 reactfx

我了解了如何使用 Val.selectVar(property, propertyOfProperty) 之类的方法创建对属性的包含属性的依赖关系。但是,我想知道如何继续创建对组合图的依赖关系。就像属性(property)的属性(property)的属性(property)等等。

以下是我所知道的和我想要的示例:

import org.reactfx.value.Val;
import org.reactfx.value.Var;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;

class Level1 {
    private ObjectProperty<Level2> l2 = new SimpleObjectProperty<>(new Level2());
    ObjectProperty<Level2> l2Property() { return l2; }
}

class Level2 {
    private ObjectProperty<Level3> l3 = new SimpleObjectProperty<>(new Level3());
    ObjectProperty<Level3> l3Property() { return l3; }
}

class Level3 {
    private ObjectProperty<Level4> l4 = new SimpleObjectProperty<>(new Level4());
    ObjectProperty<Level4> l4Property() { return l4; }
}

class Level4 {
    private IntegerProperty ip = new SimpleIntegerProperty();
    IntegerProperty ipProperty() { return ip; }
}

public class Example3 {

    Example3() {
        Level1 l1 = new Level1();
        Level2 l2 = l1.l2Property().get();
        Level3 l3 = l2.l3Property().get();
        Level4 l4 = l3.l4Property().get();
        Var<Number> ipVar = Val.selectVar(l3.l4Property(), Level4::ipProperty);
        ipVar.addListener((ob, o, n) -> System.out.println(o + " -> " + n));

        l4.ipProperty().set(1); // prints "0 -> 1"

        Level4 newL4 = new Level4();
        newL4.ipProperty().set(2);
        l3.l4Property().set(newL4);  // prints "1 -> 2"

//      Something that does this
//      ipVar2.listenTo(l2.l3Property(), l1.l2Property());
//      or this
//      Var<Number> ipVar2 = Val.selectVarAll(l1.l2Property(), l2.l3Property(), l3.l4Property(), Level4::ipProperty);

        Level3 newL3 = new Level3();
        l2.l3Property().set(newL3); // I want: prints "2 -> 0"

//      level2 etc.
    }

    public static void main(String[] args) {
        new Example3();
    }
}

基本上,我想知道某个属性何时会因包含该属性的属性中的任何位置的更改而发生更改,而不仅仅是直接属性的更改。

最佳答案

没有

Var<Number> ipVar2 = Val.selectVar(l1.level2Property(), Level2::level3Property)
    .selectVar(Level3::level4Property)
    .selectVar(Level4::ipProperty);

给你你需要的东西?

(如果您只需要 ObservableValue 而不是 Property - 即,如果您只需要观察而不写入值 - 您可以使用 flatMap 而不是 selectVar 。)

关于java - 如何创建多级组合绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076948/

相关文章:

java - 无法在 eclipse 中将项目 facet ear 的版本更改为 1.3 maven 错误?

Java:从 char 解析 int 值

java - 使用场景构建器中创建的 fxml 文件从 java 添加图像

java - 父舞台中央舞台

Java h2 sql 结果显示 'clob<x>' 而不是基本字符串

JavaFX - MVC - 如何从另一个包加载图像

javafx-2 - JavaFX、MediaPlayer——体积问题!为什么 mediaPlayer 的音量没有一点点变化?

java - 嵌套循环问题,打印出错误的数字

java - Jaxb Complex Marshal 元素

java - 如何在javaFX中从ComobBox获取文本?