【问题标题】:JavaFX fx:include scene visibility of parent controllerJavaFX fx:包括父控制器的场景可见性
【发布时间】:2016-05-19 19:44:09
【问题描述】:

据我从相当缺乏的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 文件是否需要自己的控制器?如果需要,为什么?在不需要多个控制器之间进行通信的情况下分离大部分场景图将是一个不错的功能。

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-02
      • 2012-10-07
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多