首页 文章

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

提问于
浏览
0

至于我可以从相当缺乏的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>

这里,child.fxml中的节点对于父控制器是不可见的,尽管child.fxml中的节点成为了根有控制器的场景图的一部分 . 结果(如果要将事件处理程序附加到aButton)是NullPointerException .

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

1 回答

  • 1

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

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

相关问题