我调整了我的控制器构造函数和fxml,以便fxml对控制器的所有设置都在fxml中,除了FXML构造和fxml加载。这是我的控制器:
public class MainOverviewTab extends Tab {
@FXML private AnchorPane content;
public MainOverviewTab() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main_overview_tab.fxml"));
// fxmlLoader.setRoot(content);
// fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
}
和我的fxml文件:
<AnchorPane id="AnchorPane"
fx:id="content"
fx:controller="dominion.application.controller.MainOverviewTab"
...other settings >
<children>
....
</children>
</AnchorPane>
当调用fxmlLoader.load()并返回到FXMLLoader fxmlLoader = new FXMLLoader(...)然后再次调用fxmlLoader.load()时发生stackoverflow ...为什么会发生这种情况?我该怎么办?保持我的控制器构造函数相同并加载fxml相同?或者这不可能吗?
答案 0 :(得分:1)
你不应该在contructor中调用FXml loader。因为当你使用FXml加载器加载fxml文件时,它会一次又一次地递归创建MainOverviewTab。所以它会导致堆栈溢出错误。如果从构造函数中删除代码并从显式方法调用它将起作用。
public static void mainTabLoader() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main_overview_tab.fxml"));
// fxmlLoader.setRoot(content);
// fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
如果在FXMLLoader实例上调用setController(...),则不应在FXML文件中指定控制器。从FXML文件中删除fx:controller属性并取消注释setRoot(...)和setController(...)调用,它应该可以工作。
答案 2 :(得分:0)
当控制器构造函数尝试使用fx:controller属性命名FXML加载FXML时,它将无限递归地发生。到那里了...巧妙地使用fxmlLoader.setControllerFactory(factoryObject)可以解决这个问题。
有关基于FXML的控件,其根元素中保留了fx:controller属性,请参见我的answer。