2

我无法将简单的 fxml 文件包含到 BorderPane 或 TabPane 中。此处已报告了包括一些示例代码在内的详细信息: https ://bitbucket.org/gluon-oss/scenebuilder/issues/68/various-problems-trying-to-inlcude-an-fxml

根据这个话题,我还有几个问题:

  1. 您可以将 fx:include 放入的容器是否有限制?(例如,不允许 TabPanes 吗??)
  2. 在我丢失的包含的 FXML 文件中,我必须做一些具体的事情吗?
  3. 还有什么提示吗?

如果您遇到同样的问题 - 也许您可以投票支持该错误,因此我们增加了获得修复的机会。

4

1 回答 1

1

默认情况下,当您使用 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节点是否允许:

外汇:包括

于 2016-03-18T17:37:02.783 回答