2014-11-04 107 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