【问题标题】:nested progress tasks into one progressbar javafx将进度任务嵌套到一个进度条 javafx
【发布时间】:2017-10-10 13:20:50
【问题描述】:

是否可以在一个进度条中呈现 2 个嵌套任务的进度? 我的意思是,如果我必须从多个目录中的多个文件中读取行。我有这个 sn-p 代码:

编辑:

final int steps = directories.size();
    Task<Integer> task2 = new Task<Integer>() {

                /**
                 */
                @Override
                protected Integer call() throws Exception {

                    int len = files.length;
                    updateProgress(0, len);

                    for(int i = 0; i < files.length; i++) {
                        final String filename = files[i].getName();
                        final String file = files[i].getPath();     

                        try {
                            BufferedReader br = new BufferedReader(new FileReader(file));
                            }

                            String currentLine = null;

                            while ((currentLine = br.readLine()) != null) {

                                readlines(currentLine, filename);
                            }

                        } catch (IOException xs) {
                            xs.getMessage();
                        } 

                        System.out.println("******* Working on: " + file +  " ******************************");
                        updateProgress(i + 1, files.length);
                    }   

                    System.out.println("done: " + directoryName);

                    return len;
                }
            };  

    task2.setOnRunning(r -> {
                DoubleBinding totalProgress = null;

                for(int i = 0; i < steps; i++) {    
                    DoubleBinding increment = task2.progressProperty().divide(steps);

                    if (totalProgress == null) {
                        totalProgress = increment;
                    } else {
                        totalProgress = totalProgress.add(increment);
                    }
                }

                progressBar.progressProperty().bind(totalProgress);
                status.textProperty().bind(task2.stateProperty().asString());
                statusProcess.textProperty().bind(Bindings.when(totalProgress.isEqualTo(-1))
                        .then("0.00")
                        .otherwise(task2.progressProperty().multiply(100.00).asString("%.02f %%")));

                console.textProperty().bind(task2.messageProperty());

            });

    new Thread(task2).start();

我可以访问进度条,但只要我有目录,进度条将重新启动到 0,并将检查文件到下一个目录,然后填充进度条直到 1,如果有则重新启动到 0另一个目录。

如果我想同时显示这 2 个任务,因为我不想在读取下一个目录时从 0 重新开始,我该怎么办。例如,如果我有 4 个目录,我希望看到进度条一直移动到它的季度,依此类推。

有人知道我做错了什么吗?

【问题讨论】:

    标签: javafx task


    【解决方案1】:

    你可以这样做

    progressBar.progressProperty().bind(Bindings.createDoubleBinding(
        () -> Math.max(0, task1.getProgress()) / 2 + Math.max(0, task2.getProgress()) /2 ,
        task1.progressProperty(), task2.progressProperty());
    

    如果您可以轻松估计或计算每个任务将花费的相对时间,您可以相应地对每个任务的进度进行加权,而不是像上面的代码中那样简单地平均它们。

    【讨论】:

    • 感谢您的回答,但这对我不起作用。如果我按照您的建议进行操作,progressBar 将从 50% 开始显示一个蓝色条,并在大约 60% 更改目录时运行超过 100% 以重新启动... :(
    • @cy8el1us 啊,好吧,我没有很好地阅读您的原始代码。为什么在第二个任务中反复将进度重置为零?通常,您在这里总共迭代了多少个文件?
    • 没有铅!我减少了代码,现在只使用一项任务。但是现在,当任务访问读取文件的方法时,访问似乎没有同步所以结果是每个文件都混合在一起。你知道如何解决这个问题吗?查看我的编辑
    • @cy8el1us 现在进度的最大值肯定是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多