【问题标题】:How do I Update a Progress bar Using Double Binding in JavaFX?如何在 JavaFX 中使用双重绑定更新进度条?
【发布时间】:2016-11-07 18:17:13
【问题描述】:

我有一个List 的任务,它们都会更新一个名为totalProgress 的通用进度条。此栏会针对每个任务单独更新。我尝试创建一个DoubleBinding 对象,以便能够根据每个任务的平均进度更新进度条,但它不起作用。

推荐帖:Multiple Tasks JavaFX

这是我正在尝试使用的代码:

double p = 0.0;
for (final Task t : tasks) {
    threadPool.submit(t);
    DoubleBinding totalProgress = Bindings.createDoubleBinding(new Callable<Double>() {
        @Override
        public Double call() {
            p = (p+t.getProgress()) / tasks.size();
            System.out.println("P"+p + "Progress"+t.getProgress());
            return p;
        }
    });
    bar.progressProperty().bind(totalProgress);
    //bar.progressProperty().bind(t.progressProperty());
    t.setOnSucceeded(handler);
}
threadPool.shutdown();

【问题讨论】:

  • 你为什么不和你链接的帖子一样呢?
  • 我试过了,但不能在双重绑定方法中使用 task1.progressProperty(), task2.progressProperty()) ide 给出了一个错误,而且我有一个任务列表,那些不是固定的。就像我将任务添加到任务列表并从列表中执行
  • 我做了这个@James_D,这是我能知道的最好的,我知道它的蹩脚但我尝试了很多,很抱歉之前的评论错误地发布了
  • 当我打印进度时它会很好,但我想绑定有一些错误?我无法纠正

标签: java multithreading javafx binding progress-bar


【解决方案1】:

按照与您链接的示例相同的方式进行操作:

Observable[] progressProps = new Observable[tasks.size()];

for (int i = 0 ; i < tasks.size(); i++) {
    progressProps[i]=tasks.get(i).progressProperty();
}

DoubleBinding totalProgress = Bindings.createDoubleBinding(new Callable<Double>() {
    @Override
    public Double call() {
        double total = 0 ;
        for (Task task : tasks) {
            total = total + task.getProgress();
        }
        return total / tasks.size();
    }
}, progressProps);
bar.progressProperty().bind(totalProgress);


for (final Task t : tasks) {
    threadPool.submit(t);
    t.setOnSucceeded(handler);
}

【讨论】:

  • 感谢@James_D 的回答,但您能解释一下为什么这行 tasks.toArray(new Task[0])。以及为什么编译器告诉将行转换为 Observable[]
  • 而且它现在抛出了 Class Caste 的异常,你能请我那句话吗,我是绑定的新手
  • 哎呀,是的,这行不通……你需要一个可观察的数组;绑定将绑定到那些,因此如果其中任何一个发生更改,则绑定知道其值已更改。因此,该参数需要是一个包含进度属性的数组(而不是包含任务的数组)。查看更新的代码。
  • 我们还需要在 task.getProperty 上添加 DoubleProperty 的演员表,因为它是 ReadonlyDoubleProperty
猜你喜欢
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多