如何在JavaFX中双向绑定嵌套属性?
如何在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
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);
}
});
同样,在另一个方向