2016-12-07 48 views
1

當我試圖訪問實際觀看屏幕,但我每次訪問時間之前一個Accordian的元素,它有沒有孩子。一旦我走訪了舞臺,孩子們就會出現。我已經在SceneBuilder中構建了這個場景,一旦所有組件在屏幕上都可見,它就會按預期工作。了JavaFx - 被元素創建

將整個結構用FXMLLoader加載。由於項目大小(30k +代碼行),我無法發佈代碼。我已經驗證了FXMLLoader正在運行,我得到的所有規定的Parent的頂級元素。 (按照預期工作,直到我試圖在加載舞臺之前訪問元素)

我試圖在應用程序的所有不同階段調用start(stage)以強制它們完全加載,但我仍然得到了相同的結果結果。

這裏是讓所有Node的孩子都能正常工作的代碼,在舞臺已經在屏幕上可見之前工作正常,直到只有頂級物品被發現並且他們都有0個孩子。

public static ObservableList<Node> getAllChildren(Node n) { 
     ObservableList<Node> allChildren = FXCollections.observableArrayList(); 

     ObservableList<Node> children = ((Parent) n).getChildrenUnmodifiable(); 

     for (Node c : children) { 
      if (c instanceof Parent) { 
       ObservableList<Node> cp = ((Parent) c).getChildrenUnmodifiable(); 
       if (cp.size() > 0) { // 0 for all top-level Parents until the stage has been visually loaded. 
        ObservableList<Node> nodes = getAllChildren(c); 
        for (Node node : nodes) { 
         allChildren.add(node); 
        } 
       } 
      } 

      allChildren.add(c); 
     } 

     return allChildren; 
    } 

編輯:進一步testign表明,結構實際上是建立在要素(在這種情況下TabPane,我能夠使用getTabs().get(n).getContent()並會得到與他們的孩子的標籤如預期但是,。此時在執行,我仍然得到了TabPane沒有孩子。直到階段已經顯示後,它不會有孩子。

回答

2

一個Control的孩子加入到Contol創建skin時,它通過默認情況發生在Control已完成第一次。

TitledPane tp = new TitledPane(); 

Accordion acc = new Accordion(tp); 
System.out.println(acc.getChildrenUnmodifiable().size()); // 0 

Scene scene = new Scene(acc); 

// layout happens here 
acc.applyCss(); 
acc.layout(); 

System.out.println(acc.getChildrenUnmodifiable().size()); // 1 
+0

感謝澄清! – Chris