默认情况下,当您使用 Scene Builder 菜单将一个 FXML 文件包含到另一个文件中时File -> Include -> FXML...
,包含的文件将添加到根目录下,具体代码如下:
final FXOMObject rootObject = targetDocument.getFxomRoot();
if (rootObject != null) {
final Selection selection = getEditorController().getSelection();
if (selection.isEmpty() || selection.isSelected(rootObject)) {
targetObject = rootObject;
} else {
targetObject = selection.getAncestor();
}
...
}
对于您的AnchorWithTabPane.fxml
文件,如果您不选择任何内容,它将包含在根目录下:
<AnchorPane ...>
<children>
<TabPane .../>
<fx:include source="UserControl.fxml" />
</children>
</AnchorPane>
现在,如果您选择TabPane
,通过 else 条件,它将再次进入根目录下,因为 tabPane 的祖先是根本身。
如果您选择Tab
,则祖先是TabPane
,但您不能在此处包含 FXML 节点。
如果您选择AnchorPane
选项卡的 ,则祖先是选项卡,并且您也不能在其中包含 FXML 节点。
因此,在这种情况下,解决方案或解决方法是将一些内部容器或节点添加到该锚窗格,然后选择它:因为它的祖先将是AnchorPane
,它将在那里添加 FXML 节点。
最后,您可以删除该临时容器/节点。
结果,您将拥有:
<TabPane ...>
<tabs>
<Tab text="Untitled Tab 1">
<content>
<AnchorPane ...>
<children>
<fx:include source="UserControl.fxml" />
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Untitled Tab 2">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
</tabs>
关于您关于哪些容器可以容纳 的问题fx:include
,下面的所有窗格javafx.scene.layout.*
都可以容纳它们。
作为提示,如果您使用 NetBeans,编辑一个 fxml 文件,然后在容器标签中单击 Ctrl+空格,它将显示该fx:include
节点是否允许: