У меня есть свойство 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, который является эквивалентом динамического связывания третичного оператора (то есть условия ?
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);
@StackOverflow Нет, потому что вы хотите, чтобы выбранное свойство width
всегда было из VBox
, которое находится в ObservableValue<VBox>
в любой момент, а не только из VBox
, которое есть, когда вызывается метод (для создания привязки).
Разве не должно быть
Bindings.selectDouble(nodeProperty.get(), "width")
вместоBindings.selectDouble(nodeProperty, "width")
и то же самое с ростом?