我试图弄清楚如何将Task的progress属性绑定到Task的调用函数中使用的对象的属性。
从概念上讲,我有一个对象可以完成一定数量的工作并通过DoubleProperties公开它的进度。由于我想从JavaFX主线程执行此(长时间运行)任务,我想将其包装在Task对象中,并能够显示底层对象的进度。然而,似乎更新任务进度的唯一方法是通过updateProgress()方法,该方法采用具体数字而不是Observables。类似地,progressProperty作为ReadOnlyDoubleProperty公开,因此我不能以这种方式设置属性,也不能覆盖progressProperty()方法以返回我想用来显示进度的属性。
更具体地说,我想这样做:
final FooBuilder builder = new FooBuilder();
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
//
// bind to FooBuilders progress property here...but how?
// Progress of doLongBuildThing is reflected in an exposed
// DoubleProperty in the FooBuilder class.
//
//
builder.doLongBuildingThing();
return null;
}
};
这看起来像是一个基本的东西,应该很容易,但我没有看到一个直接的方法来实现它。任何帮助,将不胜感激。
TIA。
答案 0 :(得分:3)
builder.progressProperty().addListener((obs, oldProgress, newProgress) ->
updateProgress(newProgress, 1.0));
(假设FooBuilder
的进度属性范围为0到1)。
答案 1 :(得分:0)
由于您已经在对象中完成了进度,因此除以最大工作量以获得百分比并将其直接绑定到progress indicator's progress(DoubleProperty)。将绑定包装在Platform.runLater中以确保安全,您基本上在任务中完成setProgress()的所有工作。