Стадия пользовательского оповещения JavaFx - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать настраиваемое оповещение, которое будет отображать сообщение пользователю, пока оно не завершит задачу (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();
     }

}

1 Ответ

0 голосов
/ 12 декабря 2018

Вам необходимо выполнить длинную операцию в фоновом потоке и выполнить обновление после ее завершения.

Самый простой подход - использовать 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 обеспечивает некоторую функциональность для выполнения промежуточных обновлений в потоке приложения javafx и позволяет регистрировать обработчики, которые обрабатывают различные результаты в этом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...