2015-09-25 3 views
2

мне нужно, чтобы показать диалоговое окноJavaFX показать диалог после задачи нить завершается

Stage dialog = new Stage(); 
      dialog.initStyle(StageStyle.UTILITY); 
      Scene scene = new Scene(new Group(new Text(25, 25, "All is done!"))); 
      dialog.setScene(scene); 
      dialog.showAndWait(); 

после того, как моя нить завершает задачу

Thread t = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        doSomeStuff(); 
       } 

      }); 

Я попытался

Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       doSomeStuff(); 
      } 

     }); 
     t.start(); 
     t.join(); 
     Stage dialog = new Stage(); 
     dialog.initStyle(StageStyle.UTILITY); 
     Scene scene = new Scene(new Group(new Text(25, 25, "All is done!"))); 
     dialog.setScene(scene); 
     dialog.showAndWait(); 
    } 

, но это приложение не отвечает до тех пор, пока не закончится doSomeStuff()

ответ

8

t.join() - блокирующий вызов, поэтому он блокирует поток приложения FX до тех пор, пока фоновый поток не завершится. Это предотвратит перерисовку пользовательского интерфейса или от ответа на ввод пользователя.

Самый простой способ сделать то, что вы хотите использовать Task:

Task<Void> task = new Task<Void>() { 
    @Override 
    public Void call() throws Exception { 
     doSomeStuff(); 
     return null ; 
    } 
}; 
task.setOnSucceeded(e -> { 
    Stage dialog = new Stage(); 
    dialog.initStyle(StageStyle.UTILITY); 
    Scene scene = new Scene(new Group(new Text(25, 25, "All is done!"))); 
    dialog.setScene(scene); 
    dialog.showAndWait(); 
}); 
new Thread(task).start(); 

низкого уровня (т.е. без использования API высокого уровня JavaFX предоставляет) подход является запланировать отображение диалога на резьбе FX, от фоновой резьбы:

Thread t = new Thread(() -> { 
    doSomeStuff(); 
    Platform.runLater(() -> { 
     Stage dialog = new Stage(); 
     dialog.initStyle(StageStyle.UTILITY); 
     Scene scene = new Scene(new Group(new Text(25, 25, "All is done!"))); 
     dialog.setScene(scene); 
     dialog.showAndWait(); 
    }); 
}); 
t.start(); 

Я настоятельно рекомендую использовать первый подход.

Смежные вопросы