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。
据我从相当缺乏的 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。