我正在创建我的第一个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文件,但无法弄清楚这行代码的放置位置。
我希望有人可以帮我解决这个问题。
答案 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线程中运行。