Насколько я могу судить по довольно отсутствующему JavaFXML documentation, fx: include - это способ, которым можно разделить FXML на отдельные файлы, а затем включить их в другой, как если бы файлы 'содержимое было скопировано: т.е. аналогично использованию директивы компилятора C include.JavaFX fx: включить видимость сцены родительского контроллера
Однако, похоже, что это не так, поскольку узлы внутри включенного документа FXML не видны контроллеру родителей. Рассмотрим следующий пример:
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.*?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="Sample.controller">
<ToolBar xmlns:fx="http://javafx.com/fxml" fx:id="aToolbar">
<Button fx:id="aButton" text="Press me Baby!"/>
</ToolBar>
</GridPane>
Который работает, как ожидалось, но следующий код не ...
<?import javafx.scene.layout.GridPane?>
<GridPane xmlns:fx="http://javafx.com/fxml" fx:controller="Sample.controller">
<fx:include source="children.fxml"/>
</GridPane>
Где children.fxml содержит следующее (как выше):
<?import javafx.scene.control.*?>
<ToolBar xmlns:fx="http://javafx.com/fxml" fx:id="aToolbar">
<Button fx:id="aButton" text="Press me Baby!"/>
</ToolBar>
Здесь узлы в пределах children.fxml не видны родительскому контроллеру, несмотря на то, что узлы в child.fxml становятся частью графика сцены, у кого root есть контроллер. Результат (если кто-то должен был привязать обработчик события к aButton), является NullPointerException.
Итак ... Включают ли файлы FXML с использованием fx: include требуют своего собственного контроллера, и если да, то почему? Было бы неплохо отделить большие части графика сцены, не требуя связи между несколькими контроллерами.