2015-09-25 32 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應用程序線程,直到後臺線程完成。這將阻止UI被重新繪製或者響應用戶輸入。

做你想要什麼,最簡單的方法是使用一個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(); 

我強烈建議使用第一種方法。