为什么加载我的fxml时会出现stackoverflow?

时间:2013-12-11 06:07:03

标签: java javafx javafx-2 fxml

我调整了我的控制器构造函数和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相同?或者这不可能吗?

3 个答案:

答案 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