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() 方法中。还不知道为什么,但我会找出答案。
我有 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() 方法中。还不知道为什么,但我会找出答案。