JavaFX - 即使有任务,不确定的进度条也不会移动

标签 java javafx

我正在使用 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/

相关文章:

java - 依赖 JAR 和源 JAR?

java - 为什么Java在安装JDK的时候安装了JRE

java - 从 swing jCombobox 迁移到 javaFX ComboBox

Java - x32 和 x64 之间的奇数内存消耗

java - Gradle-build JavaFX 项目无法在 Windows 中运行

java - 使用 JDBC 将值插入 SQL 数据库

java - Micronaut 中 MapStruct 生成类的 NoSuchBeanException

java - java中的字符串到OffsetDateTime解析

java - 可以设置矩形样式以显示边框吗?

JavaFX登录不同页面