在initialize()中加载FXML

时间:2014-11-04 09:52:26

标签: java controller javafx fxml

我正在创建我的第一个JavaFX应用程序,到目前为止我做得很好。我刚遇到一个问题。

为了显示和加载FXML文件我正在使用StackOverflow上的VistaNavigator类:

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

我有一个ScanController,它从键盘接收输入并根据此输入检查故障单ID。当票证正常时,它会加载“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的scan-home.fxml)来扫描更多的票证。但是,在执行此代码时,只需“无”,无异常且无FXML文件更改。

当我尝试在单击按钮(在EventHandler中)后加载新视景时,它的效果很好。

我可以想象JavaFX在控制器完全初始化之前无法加载新的FXML文件,但无法弄清楚这行代码的放置位置。

我希望有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分: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线程中运行。