JavaFx ProgressIndicator 更新
JavaFx ProgressIndicator update
我知道,这个问题已经得到了足够多的回答,但没有一个解决方案适合我的问题。
案例:
我想将 1:n 个文件导入数据库。到目前为止,一切都很好。
对于每个文件,ProgressIndicator 应该重置 Progress Value。
是的,确实如此。将我的东西导入数据库时,GUI 似乎 "stuck" 直到下一个文件导入开始。
我的问题:
值会重置,但 ProgressIndicator 不会。
但是值正在正确更新。
System.out.println(progressIndicator.getProgress());
显示更新结果,直到达到 1.0。
在导入完成之前,它会直接跳到 100% 并且永远不会重置..通过有更多的导入跟随并且进度不断更新为正确的值。进度达到 1.0 = 100% 后,下一次导入开始。我的错误在哪里?
ProgressUpdater class:
public void activateBind(ReadOnlyDoubleProperty binding) {
if (pg != null) {
pg.progressProperty().unbind();
pg.progressProperty().bind(binding);
}
}
注意,所有使用的 类 都会为每个文件导入进行初始化。
PS:是的,我在我的代码中拼错了 "ProgressIndicator"。
控制器class:
@FXML
ProgressIndicator progessIndicator;
ImportTask task = new ImportTask(dbConnector, insertStatements, this);
final ProgressUpdater pgup = new ProgressUpdater(progessIndicator, dbConnector.getPercentVal());
pgup.activateBind(task.progressProperty());
new ImportThread(task, counter);
导入任务class:
@Override
protected Void call() throws Exception {
for (int i = 0; i < insertStatements.size(); i++) {
dbC.executeInsert(insertStatements.get(i));
updateProgress(dbC.getCurrent(), dbC.getEnd());
}
mc.executeImport();
return null;
}
ImportThread class 扩展自线程:
public ImportThread(Task task, int d) {
super(task, "Import " + d);
setDaemon(true);
Platform.runLater(new Runnable() {
@Override
public void run() {
start();
try {
join();
} catch (InterruptedException e) {
System.out.println("JOIN ERROR");
e.printStackTrace();
}
}
});
}
在此先感谢您的帮助。
出于某种原因,您故意强迫 UI 线程等待您的后台任务完成,方法是将对 join()
的调用包装在对 Platform.runLater()
的调用中。因此,在任务完成之前,UI 线程不能做任何其他事情(例如呈现进度指示器)。
如果您希望线程在创建时立即启动(这不是一个好主意,tbh),只需在构造函数中调用 start()
:
public ImportThread(Task task, int d) {
super(task, "Import " + d);
setDaemon(true);
start();
}
没有明显的理由Thread.start()
需要在FX应用程序线程上执行,所以这里不需要Platform.runLater()
。
我知道,这个问题已经得到了足够多的回答,但没有一个解决方案适合我的问题。
案例:
我想将 1:n 个文件导入数据库。到目前为止,一切都很好。 对于每个文件,ProgressIndicator 应该重置 Progress Value。 是的,确实如此。将我的东西导入数据库时,GUI 似乎 "stuck" 直到下一个文件导入开始。
我的问题:
值会重置,但 ProgressIndicator 不会。
但是值正在正确更新。
System.out.println(progressIndicator.getProgress());
显示更新结果,直到达到 1.0。
在导入完成之前,它会直接跳到 100% 并且永远不会重置..通过有更多的导入跟随并且进度不断更新为正确的值。进度达到 1.0 = 100% 后,下一次导入开始。我的错误在哪里?
ProgressUpdater class:
public void activateBind(ReadOnlyDoubleProperty binding) {
if (pg != null) {
pg.progressProperty().unbind();
pg.progressProperty().bind(binding);
}
}
注意,所有使用的 类 都会为每个文件导入进行初始化。 PS:是的,我在我的代码中拼错了 "ProgressIndicator"。
控制器class:
@FXML
ProgressIndicator progessIndicator;
ImportTask task = new ImportTask(dbConnector, insertStatements, this);
final ProgressUpdater pgup = new ProgressUpdater(progessIndicator, dbConnector.getPercentVal());
pgup.activateBind(task.progressProperty());
new ImportThread(task, counter);
导入任务class:
@Override
protected Void call() throws Exception {
for (int i = 0; i < insertStatements.size(); i++) {
dbC.executeInsert(insertStatements.get(i));
updateProgress(dbC.getCurrent(), dbC.getEnd());
}
mc.executeImport();
return null;
}
ImportThread class 扩展自线程:
public ImportThread(Task task, int d) {
super(task, "Import " + d);
setDaemon(true);
Platform.runLater(new Runnable() {
@Override
public void run() {
start();
try {
join();
} catch (InterruptedException e) {
System.out.println("JOIN ERROR");
e.printStackTrace();
}
}
});
}
在此先感谢您的帮助。
出于某种原因,您故意强迫 UI 线程等待您的后台任务完成,方法是将对 join()
的调用包装在对 Platform.runLater()
的调用中。因此,在任务完成之前,UI 线程不能做任何其他事情(例如呈现进度指示器)。
如果您希望线程在创建时立即启动(这不是一个好主意,tbh),只需在构造函数中调用 start()
:
public ImportThread(Task task, int d) {
super(task, "Import " + d);
setDaemon(true);
start();
}
没有明显的理由Thread.start()
需要在FX应用程序线程上执行,所以这里不需要Platform.runLater()
。