JavaFX FX :include scene visibility of parent controller

标签 java javafx fxml

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

但是,情况似乎并非如此,因为所包含的 FXML 文档中的节点对于父级 Controller 不可见。考虑以下因素:

<?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 中的节点对父 Controller 不可见,尽管事实上children.fxml 中的节点已成为根具有 Controller 的场景图的一部分。 结果(如果要将事件处理程序附加到 aButton)是 NullPointerException

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

最佳答案

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

文档 explicitly shows how to communicate在这种情况下, Controller 之间。

关于JavaFX FX :include scene visibility of parent controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37332660/

相关文章:

java - 如何在网格java中实现计时器

java - 为在 Ubuntu 上运行的 java 服务器运行 flurry

java - 如何在 NetBeans 10/JDK11 上启用 JavaFX

java - 如何在 Java 中使用 ComboBox 数据填充 ArrayList

JavaFx 在文本区域组件上绘制线条

java - 如何从一个 Java FXML Controller 中从另一个 FXML Controller 获取数据(这些 Controller 不是嵌套 Controller )?

java - 如何避免重复以下代码?

java - 为什么 .fxml 文件无法在场景生成器中打开?

JavaFX:在 ButtonBar 内对齐按钮(使用 SceneBuilder 或 fxml)

java - 根据月份和日期将日志文件放在不同的文件夹中