我正在编写一个JavaFx 控件,该控件由一个获取用户输入的子控件组成,例如TextField。主要组件拥有一个属性,该属性表示文本的解析表示,例如 LocalDateTime。当用户输入一些东西时,这个属性应该被更新,所以我将它绑定到孩子的 value 属性。还应该可以通过绑定 value 属性从外部更改当前值,因此这必须是双向绑定才能自动更新子项。该控件工作正常,直到客户端代码绑定到该属性。以下代码显示了我的问题:
导入 javafx.beans.property.SimpleIntegerProperty;
public class Playbook {
// The internal control with a property p
static class Child {
public SimpleIntegerProperty p = new SimpleIntegerProperty();
public void set(int i) {p.set(i);}
}
// My new control with a property value which is bound
// bidirectionally to Child.p
static class Parent {
public Child a1;
public SimpleIntegerProperty value = new SimpleIntegerProperty();
public Parent() {
a1 = new Child();
value.bindBidirectional(a1.p);
}
}
public static void main(String[] args) {
Parent p = new Parent();
// some client code wants to keep the
// value updated and thus binds to it
SimpleIntegerProperty outside = new SimpleIntegerProperty();
p.value.bind(outside);
// simulate a change in the child control
p.a1.p.set(10);
}
}
运行代码时,出现无法设置绑定属性的异常:
Caused by: java.lang.RuntimeException: A bound value cannot be set.
at javafx.beans.property.IntegerPropertyBase.set(IntegerPropertyBase.java:143)
at com.sun.javafx.binding.BidirectionalBinding$BidirectionalIntegerBinding.changed(BidirectionalBinding.java:467)
我确信这一定是一个常见问题,我只是没有看到明显的解决方案。我正在使用 ReactFx,因此欢迎使用纯 JavaFx 或 ReactFx 的任何解决方案。真正的代码使用 aVar.mapBidirectional
在内部绑定 Parent 和 Child 属性。
我想要实现的是: 1. 如果outside
' 的值发生变化,这应该传播到 p.value,然后传播到 p.a1.p 2. 如果 p.a1.p 发生变化,这应该传播到 p。价值
由此我得出结论,Parent.value 和 Parent.a1.p 总是相同的(加上映射中应用的一些转换),我使用双向映射。outside 可以独立更改并且可以与 value 不同,因此我使用单向绑定。