我正在努力与Bindings.when ...尝试创建一个百分比分数,该分数会在成功测试的次数发生变化(在下面的代码中反映为“successCountProperty”)或测试总数发生变化时进行更新(反映在“结果”的sizeProperty中)。当我执行此代码时,我得到了java.lang.ArithmeticException:/零。最初遇到异常时,我发现Bindings.when()。then()。otherwise()可以解决此问题。不幸的是,在执行此代码时,尽管'when'返回false,但仍在执行'then'。有人可以帮忙吗?
public void foo()
{
DoubleProperty scoreProperty = new SimpleDoubleProperty(0);
ListProperty<String> results = new SimpleListProperty<>(FXCollections.observableArrayList());
IntegerProperty successCountProperty = new SimpleIntegerProperty(0);
scoreProperty.bind(Bindings.when(results.sizeProperty().greaterThan(0))
.then(Bindings.divide(successCountProperty, results.sizeProperty())).otherwise(0));
}
最佳答案
使用Bindings
的方法或属性本身进行的更复杂的绑定很容易引起混淆,难以维护。
在这种情况下,我建议使用自定义评估方法创建DoubleBinding
:
scoreProperty.bind(Bindings.createDoubleBinding(() -> {
int size = results.size();
return size == 0 ? 0d : ((double) successCountProperty.get()) / size;
}, results.sizeProperty(), successCountProperty));