当我对这两个属性进行绑定时会发生什么?
ProgressDialog
如果两个属性都应该包含相同的对象引用,那么在这个绑定之后,两个属性都会保留ObjectProperty<Object> propertyA = new SimpleObjectProperty<>();
ObjectProperty<Object> propertyB = new SimpleObjectProperty<>();
propertyA.set(new ObjectA());
propertyB.set(new ObjectB());
Bindings.bindBidirectional(propertyA, propertyB);
或ObjectA
的引用吗?
答案 0 :(得分:4)
致电时:
Bindings.bindBidirectional(propertyA, propertyB);
propertyA
的值将设置为propertyB
的值。
因此,在这种情况下,由于propertyB
已经引用ObjectB
,因此在调用之后,这两个属性都会引用:ObjectB
测试代码
import javafx.beans.binding.Bindings;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
public class HellBound {
public static void main(String[] args) {
ObjectProperty<Object> propertyA = new SimpleObjectProperty<>();
ObjectProperty<Object> propertyB = new SimpleObjectProperty<>();
propertyA.set(new ObjectA());
propertyB.set(new ObjectB());
Bindings.bindBidirectional(propertyA, propertyB);
System.out.println("propertyA = " + propertyA);
System.out.println("propertyB = " + propertyB);
}
private static class ObjectA {
}
private static class ObjectB {
}
}
测试输出
propertyA = ObjectProperty [value: appCC.xyzzy.HellBound$ObjectB@7c3df479] propertyB = ObjectProperty [value: appCC.xyzzy.HellBound$ObjectB@7c3df479]
绑定实施源
请注意来电property1.setValue(property2.getValue());
:
public static <T> BidirectionalBinding bind(Property<T> property1, Property<T> property2) {
checkParameters(property1, property2);
final BidirectionalBinding binding =
((property1 instanceof DoubleProperty) && (property2 instanceof DoubleProperty)) ?
new BidirectionalDoubleBinding((DoubleProperty) property1, (DoubleProperty) property2)
: ((property1 instanceof FloatProperty) && (property2 instanceof FloatProperty)) ?
new BidirectionalFloatBinding((FloatProperty) property1, (FloatProperty) property2)
: ((property1 instanceof IntegerProperty) && (property2 instanceof IntegerProperty)) ?
new BidirectionalIntegerBinding((IntegerProperty) property1, (IntegerProperty) property2)
: ((property1 instanceof LongProperty) && (property2 instanceof LongProperty)) ?
new BidirectionalLongBinding((LongProperty) property1, (LongProperty) property2)
: ((property1 instanceof BooleanProperty) && (property2 instanceof BooleanProperty)) ?
new BidirectionalBooleanBinding((BooleanProperty) property1, (BooleanProperty) property2)
: new TypedGenericBidirectionalBinding<T>(property1, property2);
property1.setValue(property2.getValue());
property1.addListener(binding);
property2.addListener(binding);
return binding;
}
其他问题的答案
我只是想知道为什么javadoc没有告诉我们这种有用的信息。
因为javadoc是由人而不是神创造的。有时人类会做出深不可测的遗漏。也许上帝也这样做: - )
我同意它应该是Javadoc中的有用信息。
可以提交错误报告以改进文档(http://bugreport.java.com)。或者openjfx-dev开发人员列表中的帖子可能会让开发人员具有提交权限的提交权限。您可以自己提交补丁,但是,对于大多数人来说,除非他们已经是签署OCA的JDK提交者,否则可能不值得。
我假设ObservableLists也应该相同,这样Bindings.bindContentBidirectional()应该以相同的方式工作?
是的,该方法的来源有以下代码:
list1.setAll(list2);