【问题标题】:JavaFX app: show progress in bar while reading fileJavaFX 应用程序:在读取文件时在栏中显示进度
【发布时间】:2018-01-01 19:01:41
【问题描述】:

我有一个 csv 文件阅读器,它调用一个应该更新进度条的方法。但是,即使我尝试使用 Platform.runLater 来安排进度条,进度条也不会更新。文件读取是同步处理的一部分,所以我不能只在自己的线程中运行阅读器——我必须等待线程加入。进度条在其他一些上下文中工作。我尝试了什么:

public CsvFile(File file, SEPARATOR separator)
{
    this.file = file;
    this.separator = separator.value();
    setPattern();

    Thread thread = new Thread() {
        public void run() {
            readFile();
        };
    };
    thread.start();
    try
    {
        Thread.sleep(5000);//HACK
        thread.join();//HACK
    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

还有进度条方法,由readFile()调用:

public void setProgressExecute(double progress)

{
    //ProgressExecute.setProgress(progress);
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            ProgressExecute.setProgress(progress);
        }
    });
}

更新

我现在在它自己的线程中调用new CsvFile。这使得进度条工作。但是,它也迫使我使用 Platform.runLater 来运行 GUI 更新,因为只有 JavaFX 线程可以更新 GUI 的某些部分。我的新问题是 Platform.runLater:它以 LIFO 顺序运行东西,这颠倒了处理顺序。好吧,我猜你不可能拥有这一切。

【问题讨论】:

  • 如果您只是要等待它在当前线程中完成,那么使用后台线程有什么意义呢?从Thread thread = new Thread() { catch 块末尾的代码基本上等同于简单地调用readFile()
  • 好吧,我很绝望。我以为如果我让线程休眠,也许 Platform.runlater 会有机会运行,但这不起作用。
  • CsvFile 构造函数调用的是什么线程?
  • documentation for javafx.concurrent.Task 包含一个可以帮助您的相关示例。
  • “我的新问题是 Platform.runLater:它以 LIFO 顺序运行东西,这颠倒了处理顺序”。我认为不会发生这种情况:documentation 明确指出相反的情况(“Runnables 是按照它们发布的顺序执行的。传递给 runLater 方法的 runnable 将在任何 Runnable 传递给后续调用 runLater 之前执行。 ")。

标签: java javafx progress-bar


【解决方案1】:

您可以创建一个服务类(LogFilesService extends Service)并绑定progressProperty。 在 Service 类中,您可以使用 updateProgress 来更新进度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多