【问题标题】:Load FXML in initialize()在 initialize() 中加载 FXML
【发布时间】:2014-11-04 09:52:25
【问题描述】:

我正在创建我的第一个 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() 方法中,我有以下代码 sn-p:

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

所以我想显示成功页面大约 2 秒,然后返回主屏幕(scan-home.fxml 和控制器 ScanHomeController.java)扫描更多票证。然而,当执行这段代码时,什么都没有发生,没有异常,也没有 FXML 文件的变化。

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

我可以想象,JavaFX 在控制器完全初始化之前无法加载新的 FXML 文件,但无法确定将这行代码放在哪里..

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

【问题讨论】:

    标签: java controller javafx fxml


    【解决方案1】:

    这个呢:

    @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 线程中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      相关资源
      最近更新 更多