2016-12-07 9 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; 
    } 

EDIT: Далее 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

 Смежные вопросы

  • Нет связанных вопросов^_^