2014-11-04 90 views
0

我正在創建我的第一個JavaFX應用程序,到目前爲止我都做得很好。我只遇到一個問題。在initialize()中加載FXML

顯示和加載FXML文件我使用StackOverflow上發現了一個VistaNavigator類:

public static void loadVista(String fxml) { 
    try { 
     mainController.setVista(
      FXMLLoader.load(
       VistaNavigator.class.getResource(
        fxml 
       ) 
      ) 
     ); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

我有一個ScanController,從鍵盤接收輸入並檢查在此基礎上輸入票號。當票證正常時,它載入「scan-success.fxml」,否則載入「scan-failure.xml」,每個FXML文件都有一個自己的控制器。我正在像這樣加載成功的FXML:

VistaNavigator.loadVista(VistaNavigator.VISTA_SCAN_SUCCESS); 

這很好。 Success-FXML頁面正在顯示,ScanSuccessController正在加載。在ScanSuccessController.java的initialize()方法,我有以下的代碼片段:

try { 
     Thread.sleep(2000);     //1000 milliseconds is one second. 
     VistaNavigator.loadVista(VistaNavigator.VISTA_SCAN_HOME); 
    } catch(InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 

所以我想顯示成功頁面約2秒鐘,然後頭回主屏幕(掃描 - 帶控制器ScanHomeController.java的home.fxml)掃描更多票據。但是,執行此代碼時,只是'沒有'發生,沒有例外,也沒有FXML文件的更改。

當我點擊一個按鈕(在EventHandler中)後嘗試加載新的Vista時,它的效果很好。

我可以想像,JavaFX是無法加載一個新的FXML文件之前,控制器已完全初始化,但不能找出哪裏,就把這行的代碼..

我希望有人能幫助我與此。

回答

2

這個怎麼樣:

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    Timeline timeline=new Timeline(); 
    timeline.getKeyFrames().add(new KeyFrame(Duration.seconds(2), 
      e->VistaNavigator.loadVista(VistaNavigator.VISTA_SCAN_HOME))); 
    timeline.play(); 
} 

注意,通過使用Timeline一切都在JavaFX的線程中運行。

+0

很好,謝謝! – Kaduna 2014-11-04 20:28:43