0

在介绍 EasyBind 之前 -

DoubleBinding contentHeight = Bindings.createDoubleBinding(
    () -> getHeight() - getInsets().getTop() - getInsets().getBottom(),
    heightProperty(), insetsProperty());

介绍 EasyBind 之后 -

Binding<Double> contentHeight = EasyBind.combine(
    heightProperty(), insetsProperty(),
    (h, i) -> h.doubleValue() - i.getTop() - i.getBottom());

我对doubleValue()部分感到有些不舒服。每次我combine的一些子类时NumberProperty,EasyBind 通过Number而不是 ie Double, Integer, ...

有什么办法可以避免doubleValue()吗?

4

1 回答 1

0

导致您需要调用的不是 EasyBind doubleValue()- 这是 JavaFX API 的结果。

EasyBind.combine()有一个参数列表(ObservableValue<A>, ObservableValue<B>, BiFunction<A,B,R>),并返回一个Binding<R>。对于您传入的第一个参数DoubleProperty。问题是DoubleProperty(有点违反直觉)实现ObservableValue<Number>,而不是ObservableValue<Double>. 该combine方法在调用前两个参数的结果上调用您的 BiFunction getValue():即它调用getValue()您的DoubleProperty,它返回 a Number,而不是 a Double。因此,您BiFunction必须是 a BiFunction<Number, Insets, Double>(映射 aNumberInsetsa Double)。

您可以考虑实现 your heightPropertyas a ObjectProperty<Double>,这将允许您省略对doubleValue();的调用 但这可能会使您的应用程序的其他部分更难编码(特别是如果您对高度有其他绑定)。我不确定我是否会考虑提出doubleValue()问题。

于 2014-11-17T13:58:07.117 回答