JavaFX:在启动画面中使用不确定的进度条

JavaFX : Use an Indeterminate Progressbar in a splashScreen

我有启动画面:

我需要进度条的动画(不确定),但它不起作用。

这可能是因为我的线程在我的初始化方法中是 运行。

public class splashscreenController implements Initializable {
  @Override
  public void initialize(URL location, ResourceBundle resources) {
    new SplashScreen().run();
  }

  class SplashScreen extends Task {
    @Override
    public Object call() {

        Platform.runLater(new Runnable() {
            @Override
            public void run()
                Parent root = null;
                try {
                    Thread.sleep(3000);
                    root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));
                } catch (InterruptedException | IOException e) {
                    e.printStackTrace();
                }
                Stage stage = new Stage();
                stage.initStyle(StageStyle.UNDECORATED);

                assert root != null;
                Scene scene = new Scene(root, 1280, 720);
                stage.setScene(scene);
                stage.show();
                MainJavaFx.setPrimaryStage(stage);
                ((Stage) panParent.getScene().getWindow()).close();
            }
        });
        return null;
    }
  }
}

您的代码中有 2 个问题:

new SplashScreen().run();

A Task 不在新线程上为 运行 提供功能。 run 在调用线程上执行。

class SplashScreen extends Task {
    @Override
    public Object call() {

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                // placeholder for parts of your code
                longRunningOperation();
                guiUpdate();
            }
        });
        return null;
    }
}

即使您在单独的线程上执行此任务,传递给 Platfrom.runLaterRunnable 也会在 JavaFX 应用程序线程上执行,并且从此可运行对象执行长时间 运行 操作会冻结图形用户界面。

改为在后台线程上执行所有长 运行 操作,并且仅使用 Platfrom.runLater.

执行短更新
new Thread(new SplashScreen()).start();
class SplashScreen extends Task {
    @Override
    public Object call() throws IOException, InterruptedException {
        Thread.sleep(3000);
        final Parent root = FXMLLoader.load(getClass().getResource("../gui/NewUI.fxml"));

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                Stage stage = new Stage();
                stage.initStyle(StageStyle.UNDECORATED);

                Scene scene = new Scene(root, 1280, 720);
                stage.setScene(scene);
                stage.show();
                MainJavaFx.setPrimaryStage(stage);
                ((Stage) panParent.getScene().getWindow()).close();
            }
        });
        return null;
    }
}

请注意,由于您没有使用 Task 提供的功能,您可以简单地使用 class 实现 Runnable,而不是从 Task 继承。