我有node属性,即ObjectProperty<VBox>,我希望有依赖于node属性的nodeSize属性。
它看起来是这样的:
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属性更改其值时,不需要创建绑定,还有其他方法来处理这个问题吗?
发布于 2020-12-09 17:09:23
我认为您需要Bindings.when,它是与第三级操作符(即条件? 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);https://stackoverflow.com/questions/65220286
复制相似问题