JavaFX fx:包含父控制器

时间:2016-05-19 19:44:09

标签: java javafx fxml

就我可以从相当缺乏的JavaFXML documentation收集来说,fx:include是一种可以将FXML分成单个文件然后将它们包含到另一个文件中的方式,就好像文件的内容是复制的一样 - 粘贴:即类似于使用C include编译器指令。

然而,看起来情况并非如此,因为所包含的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

所以...使用 fx:include 包含的FXML文件是否需要自己的控制器?如果是,为什么?分离场景图的大部分而不需要多个控制器之间的通信将是一个很好的功能。

1 个答案:

答案 0 :(得分:1)

是的,包含的FXML文件是单独的FXML文件,因此它们应该有自己的控制器类。这使得包含的部分可以重复使用,而不需要包含FXML文件的控制器,并且意味着您可以更改包含的FXML文件,而不必担心它可能包含在哪里,以及您可能破坏的其他代码。换句话说,所包含的FXML控制器对本身就是完全封装的。

本案例中控制器之间的文档explicitly shows how to communicate