2016-08-30 7 views
-1

Я создал панель «mainPane» в SceneBuilder 8 с 3 вкладками: «Главная», «Конфигурация» и «Отчеты». В отдельном файле FXML я создал вторую панель вкладок «UserPane».Как найти определенный узел в дереве узлов JavaFX?

Во время выполнения я хочу поместить свою userPane на вкладку «Конфигурация» основной панели. Для этого мне нужно получить ссылку на вкладку «Конфигурация».

Я могу сделать это, вручную перейдя по дереву узлов mainPane, ища TabPane с названием «Конфигурация». Хотя это будет работать, это уродливо, и я предпочел бы грызть свою собственную ногу.

Есть ли простой способ найти конкретный узел в дереве узлов mainPane?

+0

Не могли бы вы просто сделать это в контроллере для 'mainPane'? Он уже будет ссылаться на вкладку «Конфигурация» (или может легко получить ее); и было бы естественным местом для загрузки файла FXML, содержащего 'userPane'. Возможно, вам нужно добавить код, который иллюстрирует структуру, которую вы имеете. –

+0

@James_D Теперь, чтобы получить ссылку на панель конфигурации, мне все равно придется вручную перемещать дерево, хотя я бы начал спускаться на один уровень ниже. –

+0

Зачем вам это нужно? Разве вкладка не определена в файле FXML? Вам нужно опубликовать код, чтобы проиллюстрировать проблему. –

ответ

0

Вы должны взглянуть на метод «поиска» класса Node. Он делает то, что вы ищете.

+0

Я посмотрел на метод поиска, и это казалось идеальным. Тем не менее, для параметра CSS Selector требуется параметр CSS Select, и я был уверен, что это идентификатор id, fx: id или селектор, используемый в CSS, на который ссылается FXML. Поскольку userPane не ссылается на CSS, существует нет такого селектора для меня. Является ли обязательным параметром id или fx: id? –

+0

Я действительно рассматриваю поиск как немного взлома, особенно если вы пытаетесь ссылаться на узлы, которые вы создали сами (где-то в вашем коде). Поиск может быть полезен для того, чтобы узлы были встроены в элементы управления, определенные библиотекой, когда API не предоставил вам доступ, но это краевые случаи. Если вы сами определили узел, у вас есть (более надежный) механизм для доступа к нему. –

+0

Получается, что поиск работал отлично. Благодарю. –

0

Вы можете просто использовать usual mechanism of @FXML-injection: файл

Главная панель FXML:

<AnchorPane ...fx:controller="com.mycompany.myproject.MainController"> 

    <TabPane> 

     <tabs> 

      <!-- ... --> 

      <Tab text="Configuration" fx:id="configTab"/> 

     </tabs> 

    </TabPane> 

</AnchorPane> 

, а затем

public class MainController { 

    @FXML 
    private Tab configTab ; 

    // ... 

} 

Теперь, если вы получите, чтобы загрузить FXML на панели пользователя в главный контроллер, вы только что делаете

configTab.setContent(FXMLLoader.load(getClass().getResource("path/to/userPane.fxml"))); 

Если нет, вы можете просто определить способ, например setConfigContent(Parent content), в главном контроллере и вызвать его из любого места, где вы загружаете пользовательскую панель.

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