为什么我在加载fxml时会得到stackoverflow?

我调整了我的控制器构造函数和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文件:

   ....   

当调用fxmlLoader.load()并返回到FXMLLoader fxmlLoader = new FXMLLoader(…)然后再次调用fxmlLoader.load()时发生stackoverflow …为什么会发生这种情况以及如何保持我的控制器构造函数相同并加载fxml相同? 或者这不可能吗?

你不应该在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(); } 

}

如果在FXMLLoader实例上调用setController(…),则不应在FXML文件中指定控制器。 从FXML文件中删除fx:controller属性并取消注释setRoot(…)和setController(…)调用,它应该工作。