2016-02-12 238 views
4

我在這裏展示我的歡迎場景的圖像。在繼續之前更新您的UI並強制等待JavaFX

image

新建項目按鈕在此處顯示的當前行爲:

Stage stage = (Stage)((Node)event.getSource()).getScene().getWindow(); 
stage.hide(); 
Parent root = FXMLLoader.load(getClass().getResource("/view/scene/configure/NewProjectConfigureScene.fxml")); 
Scene scene = new Scene(root); 
stage.setTitle("Configure New Project Settings"); 
stage.setScene(scene); 
stage.show(); 

言傳吧:按下按鈕 - >我得到的階段 - >隱藏當前場景 - >切換舞臺以獲得新場景 - >重新顯示舞臺。這種行爲正在起作用。

我是GUI編程的新手,所以請耐心等我解釋一下我需要什麼。

我現在試圖添加一個小功能,當按下創建新項目按鈕時,當前場景中會顯示一條加載消息,我強制GUI等待幾秒鐘(以便用戶有時間去看這個「加載」消息),然後繼續下一個場景。加載消息看起來像這樣。

image

我真的要實現此功能,因爲加載信息,然後等待可以更直觀,使用該程序時,從而提高自己的用戶體驗。

我最初的嘗試是做到以下幾點:

statusText.setText("Please wait..."); // statusText is the "loading message" 
Stage stage = (Stage)((Node)event.getSource()).getScene().getWindow(); 
try { 
    Thread.sleep(2000);     
} catch(InterruptedException ex) { 
    Thread.currentThread().interrupt(); 
} 
stage.hide(); 

Parent root = FXMLLoader.load(getClass().getResource("/view/scene/configure/NewProjectConfigureScene.fxml")); 
Scene scene = new Scene(root); 
stage.setTitle("Configure New Project Settings"); 
stage.setScene(scene); 
stage.show(); 

我剛纔讀here,你永遠無法入睡的UI線程,因爲它會凍結整個應用程序。所以我一直在嘗試上述鏈接的第一個答案中提到的方法,其中說使用javafx.concurrent.Task,但我一直試圖很長時間無濟於事。

如何更新UI,強制等待幾秒鐘,然後顯示新場景?

回答

8

而不是睡覺的線程,使用PauseTransition並在暫停完成後加載您的新場景。

createNewProject.setOnAction(event -> { 
    statusText.setText("Please wait..."); 
    PauseTransition pause = new PauseTransition(
     Duration.seconds(1), 
    ); 
    pause.setOnFinished(event -> { 
     Parent root = FXMLLoader.load(
      getClass().getResource(
       "/view/scene/configure/NewProjectConfigureScene.fxml" 
      ) 
     ); 
     Scene scene = new Scene(root); 
     stage.setTitle("Configure New Project Settings"); 
     stage.setScene(scene); 
     stage.sizeToScene();  
    }); 
    pause.play(); 
}); 

上面的代碼假設你只有一個單一的舞臺,讓你調整你的「歡迎光臨」的階段,成爲「配置新項目設置」的階段。

+1

非常感謝你......我想這就是我一直在尋找的東西。 (現在試試),這只是我使用場景構建器,我不熟悉lambda expresion語法 - >。我現在去讀一讀。 –

+0

這太棒了,謝謝@jewelsea –

0

您應該嘗試添加ControlsFX這將有所幫助。

你可以做到以下幾點:

Service<T> service = new Service<T>(){ 
     @Override 
     protected Task<T> createTask() { 
     return new Task<T>() { 
      @Override 
      protected T call() throws Exception { 
     //Do your processing here.      } 
      }; 
     } 
    }; 
    service.setOnSucceeded(event -> {//do your processing}); 
    service.setOnFailed(event -> {//do your processing});    
    ProgressDialog pd = new ProgressDialog(service); 
    pd.setContentText("Please wait while the window loads..."); 
    pd.initModality(Modality.WINDOW_MODAL); 
    pd.initOwner(stage); 
    service.start(); 

這將會把你的代碼在後臺線程。 ControlsFX對話框隨服務開始和停止。

+0

你能爲我詳細一點嗎?我不認爲這是我想要的......這是在顯示加載消息後強行等待一段時間。 –

+0

這是幹什麼的,在當前舞臺上設置一個MODAL窗口,以便用戶不能執行任何其他操作。您可以在任務的call()方法中加載新的視圖/階段/過程。如果您想要完全模式化而不僅僅是階段,請將initModality設置爲Modality.APPLICATION_MODAL。如果你在主FX線程上執行邏輯,那麼UI將會被阻塞。call()方法中所做的任何事情都將發生在後臺線程上,並且UI由於模態ProgressDialog而被阻止。 –

相關問題