我已经调整了控制器的构造函数和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()…为什么会发生这种情况,以及如何保持控制器构造函数是否相同,而加载的fxml是否相同?还是不可能?
您不应在in构造函数中调用FXml加载器。因为当您使用FXml loader加载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(); }
}