Bindings.createObjectBinding 和 null 依赖项
Bindings.createObjectBinding and null dependencies
我有 node
属性 即 ObjectProperty<VBox>
我想要 nodeSize
属性 取决于 node
属性.
它看起来像这样:
public final class PropertyProblem {
public PropertyProblem() {
nodeSize.bind(initNodeSizeBinding(node));
}
private ObjectBinding<Dimension2D> initNodeSizeBinding(ObjectProperty<VBox> nodeProperty) {
return Bindings.createObjectBinding(() -> {
if (nodeProperty.get() == null) {
return null;
}
VBox node = nodeProperty.get();
ReadOnlyDoubleProperty widthProperty = node.widthProperty(),
heightProperty = node.heightProperty();
return new Dimension2D(widthProperty.get(), heightProperty.get());
}, nodeProperty);
}
// node property
private final ObjectProperty<VBox> node = new SimpleObjectProperty<>(this, "node", null);
public ObjectProperty<VBox> nodeProperty() {
return node;
}
public void setNode(VBox val) {
node.set(val);
}
public VBox getNode() {
return node.get();
}
// nodeSize property
private final ReadOnlyObjectWrapper<Dimension2D> nodeSize = new ReadOnlyObjectWrapper<>
(this, "nodeSize");
public ReadOnlyObjectProperty<Dimension2D> nodeSizeProperty() {
return nodeSize;
}
public Dimension2D getNodeSize() {
return nodeSize.get();
}
}
让我们关注initNodeSizeBinding()
方法。
问题是我无法为绑定提供依赖项(节点的宽度和高度),因为显然 node
属性 可以是 null
。有没有其他方法可以在每次 node
属性 更改其值时创建绑定来解决这个问题?
我想你想要 Bindings.when,它是三级运算符的动态绑定等效项(即 condition ?
trueExpr :
falseExpr ):
return Bindings
.when(nodeProperty.isNotNull())
.then(Bindings.createObjectBinding(
() -> new Dimension2D(nodeProperty.get().getWidth(),
nodeProperty.get().getHeight()),
Bindings.selectDouble(nodeProperty, "width"),
Bindings.selectDouble(nodeProperty, "height"))
.otherwise((Dimension2D) null);
我有 node
属性 即 ObjectProperty<VBox>
我想要 nodeSize
属性 取决于 node
属性.
它看起来像这样:
public final class PropertyProblem {
public PropertyProblem() {
nodeSize.bind(initNodeSizeBinding(node));
}
private ObjectBinding<Dimension2D> initNodeSizeBinding(ObjectProperty<VBox> nodeProperty) {
return Bindings.createObjectBinding(() -> {
if (nodeProperty.get() == null) {
return null;
}
VBox node = nodeProperty.get();
ReadOnlyDoubleProperty widthProperty = node.widthProperty(),
heightProperty = node.heightProperty();
return new Dimension2D(widthProperty.get(), heightProperty.get());
}, nodeProperty);
}
// node property
private final ObjectProperty<VBox> node = new SimpleObjectProperty<>(this, "node", null);
public ObjectProperty<VBox> nodeProperty() {
return node;
}
public void setNode(VBox val) {
node.set(val);
}
public VBox getNode() {
return node.get();
}
// nodeSize property
private final ReadOnlyObjectWrapper<Dimension2D> nodeSize = new ReadOnlyObjectWrapper<>
(this, "nodeSize");
public ReadOnlyObjectProperty<Dimension2D> nodeSizeProperty() {
return nodeSize;
}
public Dimension2D getNodeSize() {
return nodeSize.get();
}
}
让我们关注initNodeSizeBinding()
方法。
问题是我无法为绑定提供依赖项(节点的宽度和高度),因为显然 node
属性 可以是 null
。有没有其他方法可以在每次 node
属性 更改其值时创建绑定来解决这个问题?
我想你想要 Bindings.when,它是三级运算符的动态绑定等效项(即 condition ?
trueExpr :
falseExpr ):
return Bindings
.when(nodeProperty.isNotNull())
.then(Bindings.createObjectBinding(
() -> new Dimension2D(nodeProperty.get().getWidth(),
nodeProperty.get().getHeight()),
Bindings.selectDouble(nodeProperty, "width"),
Bindings.selectDouble(nodeProperty, "height"))
.otherwise((Dimension2D) null);