【问题标题】:JavaFX - How to bind Task progress property to another property within the call() methodJavaFX - 如何将任务进度属性绑定到 call() 方法中的另一个属性
【发布时间】:2014-06-19 18:21:54
【问题描述】:

我试图弄清楚如何将任务的进度属性绑定到任务的调用函数中使用的对象的属性。

从概念上讲,我有一个对象可以完成一定量的工作并通过 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

【问题讨论】:

    标签: java javafx javafx-8


    【解决方案1】:
    builder.progressProperty().addListener((obs, oldProgress, newProgress) -> 
        updateProgress(newProgress, 1.0));
    

    (假设FooBuilder的progress属性范围是0到1)。

    【讨论】:

    • 谢谢 - 这工作得很好。由于构建器的寿命比调用者长,因此我将 lambdas 分配给对象,以便在调用方法结束时可以 removeListener() 。感谢您的帮助。
    【解决方案2】:

    由于您已经在对象中进行了进度处理,因此只需除以最大工作即可获得百分比并将其直接绑定到 progress indicator's progress(DoubleProperty)。为了安全起见,将绑定包装在 Platform.runLater 中,您基本上完成了任务中 setProgress() 的所有工作。

    【讨论】:

    • 我正在使用 ControlFX Dialogs API (Dialogs.showWorkerProgress),所以我无法访问底层进度条,否则我认为这将是可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2011-12-26
    • 2012-03-24
    相关资源
    最近更新 更多