JavaFX fx:include 父控制器的场景可见性

JavaFX fx:include scene visibility of parent controller

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

但是,情况似乎并非如此,因为包含的 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 中的节点对父控制器不可见,尽管 children.fxml 中的节点成为根场景图的一部分有一个控制器。 结果(如果将事件处理程序附加到 aButton)是 NullPointerException.

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

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

在这种情况下,控制器之间的文档 explicitly shows how to communicate