【问题标题】:Max of two ObservableDoubleValue as an ObservableDoubleValue两个 ObservableDoubleValue 的最大值作为 ObservableDoubleValue
【发布时间】:2016-03-21 02:08:13
【问题描述】:
鉴于ObservableDoubleValue a 和ObservableDoubleValue b,我可以像这样得到它们的最大值:
NumberBinding m = Bindings.max(a,b);
获得DoubleBinding(甚至只是ObservableDoubleValue)而不是NumberBinding 的最简单方法是什么?
【问题讨论】:
标签:
java
data-binding
javafx
javafx-8
【解决方案1】:
当您使用ObservableDoubleValue 参数之一调用Bindings.max 时,Bindings.max 将已经返回一个DoubleBinding 实例。
因此,如果您确定自己属于这种情况,您可以将结果转换为 DoubleBinding。
DoubleBinding max = (DoubleBinding) Bindings.max(a,b);
更具体地说,返回的NumberBinding 是:
-
DoubleBinding 如果参数之一是 ObservableDoubleValue。
- 如果参数之一是
ObservableFloatValue,则为FloatBinding。
- 如果参数之一是
ObservableLongValue,则为LongBinding。
- 否则
IntegerBinding。
这在NumberExpressionJavadoc 中有记录:
此 API 允许在定义算术运算时混合类型。结果的类型由与 Java 语言中相同的规则定义。
- 如果其中一个操作数是双精度,则结果是双精度。
- 如果不是并且其中一个操作数是浮点数,则结果是浮点数。
- 如果不是并且其中一个操作数是长整数,则结果是长整数。
- 否则结果为整数。
【解决方案2】:
您可以创建自己的绑定:
DoubleProperty a = ...
DoubleProperty b = ...
DoubleBinding maxBinding= new DoubleBinding() {
{
super.bind(a, b);
}
@Override
protected double computeValue() {
return Math.max(a.doubleValue(), b.doubleValue());
}
@Override
public void dispose() {
super.unbind(a, b);
}
};
另请参阅DoubleBinding 的 JavaDoc。