JavaFx 自定义警报阶段

JavaFx custom alert stage

我正在尝试创建一个自定义警报,它将向用户显示一条消息,直到它完成任务 (doOperation()) 然后我将关闭自定义警报并继续该过程。但它不能正常工作。它阻塞 Fx 线程 但不在屏幕上显示舞台,然后立即关闭。我在下面的代码中遗漏了什么吗?

class MyClass{
     void doOperation(){
      //fetch data from DB. Nothing fancy. Simply getting data from jdbc and processes the data which may take a few secs.
     }

     void fetchProcessData(){

          Stage customStage = new Stage();

          GridPane stageGrid = new GridPane();

          stageGrid.setAlignment(Pos.CENTER);
          stageGrid.setHgap(10);
          stageGrid.setVgap(10);

          Label contextLabel = new Label("Wait...");

          stageGrid.add(contextLabel, 0, 1);

          Scene scene = new Scene(stageGrid, 300, 150);

          customStage.setScene(scene);
          customStage.setTitle(title);
          customStage.initStyle(stageStyle);
          customStage.initModality(modality);

          customStage.show();

          try {
             doOperation();
             Thread.sleep(4000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }

          customStage.close();
     }

}

您需要在后台线程上执行长时间运行的操作,并在操作完成时进行更新。

最简单的方法是为此使用 Platform.runLater

customStage.show();

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            doOperation();
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // close stage on javafx application thread
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                customStage.close();
            }

        });
    }
}).start();

Task class 提供了一些在 javafx 应用程序线程上进行中间更新的功能,并允许您注册处理程序来处理该线程上的不同结果。