fxmlLoader.load() 不会加载对象层次结构

fxmlLoader.load() will not load object hiearchy

我有 2 个 windows(登录和主)以及适当的控制器。

我得到了这段代码。它位于 LoginController.java。当我 运行 应用程序时,它将从 /fxml/login.fxml 打开登录 window,其中 LoginController 设置为 fx:controller。然后是登录按钮。方法 signIn() 与此按钮相关联。当我单击它时,它将关闭登录 window、获取主 window 的控制器并从特定的 fxml 文件 (/fxml/main.fxml) 打开主 window。同时,它将从 Login window 的文本字段中获取字符串并将它们传递给 MainController(这些凭据用于执行 SQL 语句)。

public void signIn(ActionEvent event) {
    MngApi.closeWindow(btn); //closes parent window of specified node

    try{            
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/main.fxml"));            
        Parent root1 = fxmlLoader.load();
        Stage stage = new Stage();
        stage.setTitle("PrintED");
        stage.setScene(new Scene(root1, 1058, 763));//1058, 763
        MainController ctrl = fxmlLoader.getController();
        ctrl.setCredentials(uName.getText(), uPasswd.getText(), 
        ipAddress.getText(), dbName.getText());            
        stage.show();


    }catch (IOException e){

    }

}//signIn end

现在是问题所在:当我单击“登录”按钮时,将执行 signIn() 方法,登录 window 将关闭并弹出成功构建。不会打开其他 window。调试后我发现程序会停在这一行(之前的一切都完成了)

Parent root1 = fxmlLoader.load();

没有错误,没有信息,只有成功构建。对我来说最神秘的是它以前有效!登录窗口关闭,主 windows 出现。我只添加了一些新方法、动作事件和东西。我没有对 LoginController 和 fxml 文件进行任何更改。我只对 MainController 进行了更改(为 main.fxml 中的按钮添加了方法和操作事件)。

我不知道有什么不好,而且我一无所知。请帮忙!

好的,我发现出了什么问题。错误出在 initilize() 方法中。我在那里放置了一个方法,该方法应该在我的 TreeTableView 中初始化列。我认为当我 运行 程序时,初始化将执行(在 Controller 构造函数之后)并且它将 运行 逐行代码。所以我把 initializeColumns() 方法放在那里,它会先执行一次,而且只执行一次。看起来像这样:

public void initialize(){
    initializeOrdersColumns();

    //this listener will load (refresh) orders automaticaly when Orders Tab is selected
    tabOrders.setOnSelectionChanged((event) -> {
        if (tabOrders.isSelected()) {

            List<TreeItem<Order>> allOrdersList = new ArrayList<>();
            stackItems(allOrdersList, root);

        root = new TreeItem<>();
        ttwOrders.setRoot(root);
        ttwOrders.setShowRoot(false);

        }                     
    });

    //When we click refresh button, orders tab will reload Orders
    btnOrdersRefresh.setOnAction((event) -> {

        List<TreeItem<Order>> allOrdersList = new ArrayList<>();
        stackItems(allOrdersList, root);

        root = new TreeItem<>();
        ttwOrders.setRoot(root);
        ttwOrders.setShowRoot(false);

    });

}//end of initialize()

我删除了initialize()方法的内容后,一切正常,很明显错误代码在那里。然后我评论了除第一个方法(initializeColumns())之外的所有代码并且程序出错了。当我只评论 initializeColumns() 方法时,程序再次运行良好。所以很明显,initializeColumns() 不能在 initialize() 方法中。还不知道为什么,但我会找出答案。