如何在JavaFX中双向绑定嵌套属性?

如何在JavaFX中双向绑定嵌套属性?,java,binding,javafx,javabeans,Java,Binding,Javafx,Javabeans,如何在JavaFX中双向绑定嵌套属性 例如,我有一个对象p,它具有属性prop1和prop2,而属性值又同时具有这两个属性 如何将它们双向绑定,以便它们将约束为相等 package tests.javafx.beans.binding; import javafx.beans.property.SimpleDoubleProperty; import javafx.beans.property.SimpleObjectProperty; public class Try_BindNested

如何在JavaFX中双向绑定嵌套属性

例如,我有一个对象
p
,它具有属性
prop1
prop2
,而属性
又同时具有这两个属性

如何将它们双向绑定,以便它们将约束为相等

package tests.javafx.beans.binding;

import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;

public class Try_BindNested {

    public static class Nested {

        private SimpleDoubleProperty value = new SimpleDoubleProperty();

        public double getValue() {
            return value.get();
        }

        public void setValue(double value) {
            this.value.set(value);
        }

        public SimpleDoubleProperty valueProperty() {
            return value;
        }

    }


    public static class Parent {

        private SimpleObjectProperty<Nested> prop1 = new SimpleObjectProperty<Nested>();

        private SimpleObjectProperty<Nested> prop2 = new SimpleObjectProperty<Nested>();

        public Nested getProp1() {
            return prop1.get();
        }

        public void setProp1(Nested prop1) {
            this.prop1.set(prop1);
        }

        public SimpleObjectProperty<Nested> prop1Property() {
            return prop1;
        }

        public Nested getProp2() {
            return prop2.get();
        }

        public void setProp2(Nested prop1) {
            this.prop2.set(prop1);
        }

        public SimpleObjectProperty<Nested> prop2Property() {
            return prop2;
        }

    }

    public static void main(String[] args) {


        Parent p = new Parent();

        // how to bind bidirectional p.prop1.value = p.prop2.value?


    }

}
package tests.javafx.beans.binding;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.property.SimpleObject属性;
公共类Try\u{
公共静态类嵌套{
私有SimpleDoubleProperty值=新SimpleDoubleProperty();
公共双getValue(){
返回值。get();
}
公共无效设置值(双值){
此.value.set(值);
}
public SimpleDoubleProperty valueProperty(){
返回值;
}
}
公共静态类父类{
私有SimpleObjectProperty prop1=新SimpleObjectProperty();
私有SimpleObjectProperty prop2=新SimpleObjectProperty();
公共嵌套getProp1(){
返回prop1.get();
}
公共void setProp1(嵌套的prop1){
本.prop1.set(prop1);
}
公共SimpleObject属性prop1Property(){
返回prop1;
}
公共嵌套getProp2(){
返回prop2.get();
}
公共void setProp2(嵌套的prop1){
本.prop2.set(prop1);
}
公共SimpleObject属性prop2Property(){
返回prop2;
}
}
公共静态void main(字符串[]args){
父级p=新父级();
//如何绑定双向p.prop1.value=p.prop2.value?
}
}

假设您想要处理对“中间”属性的更改(即,如果您执行
p.setProp1(…);
),则无法直接使用绑定执行此操作;您必须使用一对侦听器

使用标准JavaFX属性API:

ObservableDoubleValue prop1Value = Bindings.selectDouble(p.prop1Property(), "value");
ObservableDoubleValue prop2Value = Bindings.selectDouble(p.prop2Property(), "value");
prop1Value.addListener(new ChangeListener<Number>() {
   @Override
   public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newValue) {
        p.getProp2().setValue(newValue);
   }
});
prop2Value.addListener(new ChangeListener<Number>() {
   @Override
   public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newValue) {
        p.getProp1().setValue(newValue);
   }
});

类似地,在另一个方向上。

假设您想要处理对“中间”属性的更改(即,
p.prop2。如果您执行
p.setProp1(…);
),则值将更新,
),则无法直接使用绑定执行此操作;您必须使用一对侦听器

使用标准JavaFX属性API:

ObservableDoubleValue prop1Value = Bindings.selectDouble(p.prop1Property(), "value");
ObservableDoubleValue prop2Value = Bindings.selectDouble(p.prop2Property(), "value");
prop1Value.addListener(new ChangeListener<Number>() {
   @Override
   public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newValue) {
        p.getProp2().setValue(newValue);
   }
});
prop2Value.addListener(new ChangeListener<Number>() {
   @Override
   public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newValue) {
        p.getProp1().setValue(newValue);
   }
});
同样,在另一个方向