2016-12-07 7 views
1

実際に画面を表示する前にAccordianの要素にアクセスしようとしていますが、アクセスするたびに子要素がありません。私がステージに行ったら、子供たちが現れます。私はSceneBuilderでこのシーンを構築しました。そして、すべてのコンポーネントが画面に表示されたら、期待どおりに動作します。JavaFx - 要素の作成時期

FXMLLoaderを使用して構造全体がロードされます。プロジェクトのサイズ(30k +コード行)のためにコードを投稿できません。 FXMLLoaderが実行されていることを確認しました。Parentのすべての最上位要素が指定されています。 (ステージをロードする前に要素にアクセスしようとするまで意図した通りに動作します)

アプリケーションのさまざまな段階すべてで呼び出すように試みましたが、ロードを完全に強制するように努力しましたが、結果。

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; 
    } 

EDIT:さらにtestignは、私がgetTabs().get(n).getContent()を使用することができていますし、期待通りに子どもと一緒のタブを取得する構造は、この場合TabPaneに(要素の上に構築された事実であることが明らかになったが、で。実行中のこの時間は、私はまだ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

関連する問題