JavaFX - 如何将任务进度属性绑定到call()方法中的另一个属性

时间:2014-06-19 18:21:55

标签: java javafx javafx-8

我试图弄清楚如何将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。

  • chooks

2 个答案:

答案 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()的所有工作。