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);