2016-01-13 80 views
0

這是我的應用程序的主窗口:JavaFX的節目progressindicator同時加載

screenshot

我希望能夠以更新的窗口,所以我寫了一個方法reset其中IST按F5鍵觸發:

public void reset() { 
    final ProgressIndicator pi = new ProgressIndicator(-1.0f); 

    final HBox hb = new HBox(pi); 
    final VBox vb = new VBox(hb); 

    hb.setAlignment(Pos.CENTER); 
    vb.setAlignment(Pos.CENTER); 

    scene.setRoot(vb); 

    //this.show(); 
} 

如果我運行這個看上去某事像這樣:

screenshot

但是,如果我取消對該行//this.show();這將被執行:

public void show() { 
    final VBox box = API_CALL_AND_BUILDING_BOX_MAGIC_WHICH_I_STRIPPED; 

    gp.getChildren().clear(); 
    gp.getChildren().add(box); 

    scene.setRoot(gp); 
    stage.sizeToScene(); 
} 

,我將永遠無法看到我的ProgressIndicator,因爲該應用程序將只是掛,直到APIcall結束,新內容加載。

我嘗試了一些線程和Platform.runLater(),但我不能讓它工作。我的目標是顯示ProgressIndicator,直到API調用完成,框架已經建立,場景獲得gp作爲新根。

我希望它有點難以理解我的目標,我的問題是:)

回答

1

您需要創建另一個JVM線程專用於從遠程數據源獲取數據。你的應用程序的主線程絕不能與網絡操作區塊:鍵盤事件處理程序,你只要重新粉刷主窗口的進度指示器,然後等待另一個事件,那可以是:

  • 後臺操作完成(成功,不成功)
  • 用戶中斷(鼠標/鍵盤)
  • 超時通過番石榴

    期滿

僞代碼與

不要忘記考慮套接字連接和讀取超時,以及池連接HTTP連接!還要考慮後臺任務是否應該檢查中斷標誌

+0

FFS如何在評論中創建新行? :D – daputzy

+0

Ahh其shift + enter ... 所以我想說的是: 我已經得到它的工作,即使在一個更基本的水平,那麼你建議。 你很明顯是在我之上的某個層面上操作;) 但是我現在試着按照你的建議來實現它! – daputzy

+1

請注意,由於這是一個JavaFX問題,JavaFX API定義了一個特定的['Task'](http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html)這個目的;它提供了一個'updateProgress'方法和其他回調方法來與UI線程交互。 –