我正在使用 JavaFX 制作一个简单的 UI。我创建了一个处理 SQL 查询和 Excel 文件的应用程序,然后在执行时显示进度条窗口。我读过许多其他推荐使用 taks 的 stackoverflow 问题。但是,即使使用 JavaFX 任务,也会显示进度条,但仍为空。这是我的代码:
public class ProgressBarWindow extends VBox
{
public ProgressBarWindow(Stage stage)
{
final ProgressBar pb = new ProgressBar();
pb.setProgress(ProgressBar.INDETERMINATE_PROGRESS);
Label label = new Label("Le fichier de classement est en cours de création.");
setStyle(
"-fx-padding:10; -fx-background-color: honeydew; -fx-border-color: derive(honeydew, -30%); -fx-border-width: 3;");
setPadding(new Insets(20, 20, 20, 20));
setAlignment(Pos.BASELINE_CENTER);
setSpacing(25);
getChildren().addAll(label);
getChildren().addAll(pb);
}
}
// Called when the user clicks the Finish button in a wizard
public void finish()
{
Task task = new Task<Void>()
{
@Override
public Void call()
{
try
{
StandingsCreationHelper.createStandingsFile();
}
catch (Exception ex)
{
Alert alertStandingsFileExecution = Dialog.getExceptionDialog(ex);
alertStandingsFileExecution.showAndWait();
}
return null;
}
};
new Thread(task).start();
Scene scene = new Scene(new ProgressBarWindow(owner));
owner.setScene(scene);
owner.show();
do
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
// recommended because catching InterruptedException clears interrupt flag
Thread.currentThread().interrupt();
return;
}
}
while (StandingsCreationHelper.isFinished() == false);
owner.close();
}
预先感谢您的帮助!
注意:当单独运行 ProgressBarWindow 时(添加舞台和场景并手动显示),进度条会显示我希望看到的前后移动。
最佳答案
您正在阻塞 FX 应用程序线程,阻止其渲染。切勿这样做。
您应该使用任务的 onSucceeded
处理程序在任务完成时执行代码,并使用 onFailed
处理程序来管理异常。两者都在 FX 应用程序线程上执行,这允许您通过它们与 UI 进行交互。
public void finish() {
Task task = new Task<Void>() {
@Override
public Void call() throws Exception {
StandingsCreationHelper.createStandingsFile();
return null;
}
};
task.setOnFailed(e -> {
Throwable ex = task.getException();
Alert alertStandingsFileExecution = Dialog.getExceptionDialog(ex);
alertStandingsFileExecution.showAndWait();
});
task.setOnSucceeded(e -> owner.close());
Scene scene = new Scene(new ProgressBarWindow(owner));
owner.setScene(scene);
owner.show();
new Thread(task).start();
}
关于JavaFX - 即使有任务,不确定的进度条也不会移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683687/