2016-05-19 7 views
0

Насколько я могу судить по довольно отсутствующему 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 требуют своего собственного контроллера, и если да, то почему? Было бы неплохо отделить большие части графика сцены, не требуя связи между несколькими контроллерами.

ответ

1

Да, включенные файлы FXML являются отдельными файлами FXML, поэтому они должны иметь свой собственный класс контроллера. Это делает включенную часть повторно используемой, без ссылки на включенный контроллер файла FXML, и означает, что вы можете изменить прилагаемый файл FXML, не беспокоясь о том, где он может быть включен, и какой другой код вы можете нарушать. Другими словами, включенная пара FXML-контроллеров полностью инкапсулирована сама по себе.

Документация explicitly shows how to communicate между контроллерами в этом случае.