fxmlLoader.load()不会加载对象hiearchy

时间:2017-04-29 17:12:11

标签: javafx controller fxmlloader

我有2个窗口(登录和主要)和适当的控制器。

我得到了这段代码。它位于LoginController.java中。当我运行app时,它将从/fxml/login.fxml打开登录窗口,其中LoginController设置为fx:controller。然后是登录按钮。方法signIn()与此按钮相关联。当我点击它时,它将关闭登录窗口,获取主窗口的控制器并从特定的fxml文件(/fxml/main.fxml)打开主窗口。同时,它将从Login窗口的文本字段中获取字符串并将它们传递给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()方法,登录窗口将关闭,并且会弹出SUCCESSFUL BUILD。没有其他窗口会打开。调试后我发现程序将在此行停止(之前的所有内容)

Parent root1 = fxmlLoader.load();

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

我不知道什么是坏的,我无能为力。请帮忙!

1 个答案:

答案 0 :(得分:0)

好的,所以我发现什么是错的。错误发生在initilize()方法中。我在一个方法中应该初始化TreeTableView中的列。我认为当我运行程序时,初始化wil执行(在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()方法中。不知道为什么,但我会发现。