2013-12-11 44 views
0

我調整了我的控制器構造函數和fxml,以便fxml的所有設置都在fxml中,FXML構造和fxml加載除外。這裏是我的控制器:爲什麼我在加載我的fxml時得到一個stackoverflow?

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 =新FXMLLoader(...)然後再調用fxmlLoader.load()...爲什麼會發生這種情況,以及如何保持我的控制器構造函數相同並加載fxml相同?或者這是不可能的?

+0

[這個答案](http://stackoverflow.com/a/11297531/180100)可能會幫助 – 2013-12-11 06:11:37

回答

1

您不應該在構造函數中調用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(); 
    } 

}

+0

的setRoot在這種情況下不需要setController電話。 – tomsontom

+0

但它的作品時,我取消了setRoot和setController的註釋,我刪除了fxml中的這些屬性。 –

+0

如果FXML中沒有fx:controller屬性,FXMLLoader的load(...)方法將不會實例化控制器。因此刪除該屬性會中斷無限遞歸。 –

0

如果您在FXMLLoader實例調用setController(...),你不應該在指定的文件FXML控制器。從FXML文件中刪除fx:controller屬性並取消註釋setRoot(...)和setController(...)調用,它應該可以工作。

+0

但我在構造函數中註釋掉的行是我想要刪除的行。我也想在FXML文件中保留屬性,並且我希望所有這些都沒有發生異常。 –

+0

在這種情況下,您應該將FXML的加載從控制器類中移出。通常它會在您的Application子類的start(...)方法中完成,但如果您使用多個FXML,則可能在其他位置完成。 fxmlLoader.load(...)方法解析FXML文件,看到fx:controller屬性,實例化控制器並調用其initialize()方法。如果您在構造函數(或initialize()方法)中使用相同的FXML文件調用fxmlLoader.load(...),則最終將獲得無限遞歸。 –

相關問題