【发布时间】: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