在多个场合使用线程更新 Javafx ProgressBar 时出现的问题

问题描述

我使用的是 java 8 (amazon correto)。 我在 Scenebuilder 的帮助下为项目使用 JavaFX。 我的应用程序在 Main.java 中,当前功能在 Controller.java 中实现

目前,我的目标是创建一个进度条 @FXML private ProgressBar prog;。 一旦我的 GUI 应用程序加载,我希望进度条慢慢更新,直到它从 0% 达到 50%。 然后在用户单击按钮后,我想将进度条的其余部分从 50% 更新为 100%。

我让我的控制器实现了可初始化,以便我可以将栏从 0 更新到 50%。
这是我定义用来执行此操作的 Java 任务。


import javafx.concurrent.Task;
import javafx.scene.control.ProgressBar;

public class updateBar extends Task<Void> {
     final double max_bar = 1000;
     private double start;
     private double max;
     private ProgressBar prog;

     public updateBar(double start,double max,ProgressBar prog) {
         this.start = start;
         this.max = max;
         this.prog  = prog;
     }

    @Override
    protected Void call() throws Exception {
         for (double i = this.start; i <= this.max; i++) {
            try{
                Thread.sleep(2);
            }catch (Exception e){
                System.out.println(e);
            }
            prog.setProgress(i/max_bar);
            System.out.println(prog.getProgress());
            System.out.println(i+"\t"+this.max);
//            updateProgress(i,max_bar);
        }
         return null;
    }
}

我的初始化方法如下所示:

    @Override
    public void initialize(URL location,ResourceBundle resources) {
        Thread first =  new Thread((progressB(1,(double)max_bar/2)));
        ExecutorService pool = Executors.newFixedThreadPool(1);
        pool.execute(first);

    }

问题来了,进度条的初始更新工作正常,但第二次我想更新它不起作用(这是onsubmit事件)。

这是 onsubmit 事件:

    public void onSubmit() throws InterruptedException {
        Thread last = new Thread((progressB(max_bar/2,max_bar)));
        ExecutorService pool = Executors.newFixedThreadPool(1);
        pool.execute(last);
        while (!pool.isTerminated()) {
        }
        //  method below works
        Platform.runLater(this::newWin);
    }

当我调用 onsubmit 时,线程没有启动,整个 GUI 应用程序冻结。

我也试过

    Task task = new Task<Void>() {

    @Override public Void call() {
        final int max = 1000;
        for (int i = 1; i <= max/2; i++) {
            try{
                Thread.sleep(2);
            }catch (Exception e){
                System.out.println(e);
            }
            updateProgress(i,max);
        }
        return null;
        }
    };


    Task lst = new Task<Void>() {
    @Override public Void call() {
        final int max = 1000;
        for (int i = 1; i <= max; i++) {
            try{
                Thread.sleep(1);
            }catch (Exception e){
                System.out.println(e);
            }
            updateProgress(i,max);
        }
        return null;
        }
    };

    public void onSubmit() throws InterruptedException {
        prog.progressproperty().bind(progressB(max_bar/2,max_bar).progressproperty());
        prog.progressproperty().bind(lst.progressproperty());
        Thread last = new Thread(lst);
        last.start();
        last.join();

        //  method below works
        Platform.runLater(this::newWin);
    }

    @Override
    public void initialize(URL location,ResourceBundle resources) {
       prog.progressproperty().bind(task.progressproperty());
       new Thread(task).start();
    }

我错过了什么?对于我使用的所有上述技术,进度条将无法正确更新。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)