Gluon SceneBuilder 8.1.1使用包含或导入FXML的问题

时间:2016-03-18 13:53:58

标签: javafx scenebuilder gluon

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

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

  1. 您可以将fx包含在容器中吗? (例如不允许使用TabPanes?)
  2. 我所包含的FXML文件中是否有一些特定的内容我不知道?
  3. 还有其他提示吗?
  4. 如果您遇到同样的问题 - 也许您可以投票支持该错误,因此我们增加了获得修复的机会。

1 个答案:

答案 0 :(得分:0)

默认情况下,当您使用“场景生成器”菜单File -> Include -> FXML... 一个FXML文件包含到另一个文件中时,根据以下code将所包含的文件添加到根目录下:< / p>

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条件,它会再次出现在root下面,因为tabPane的祖先就是根本身。

如果您选择Tab,则祖先为TabPane,但您不能包含FXML节点。

如果您选择标签的AnchorPane,则祖先就是标签,您也不能包含FXML节点。

因此,在这种情况下,解决方案或解决方法是将一些内部容器或节点添加到该锚点窗格,然后选择它:因为它的祖先将是AnchorPane,它将在那里添加FXML节点。

include trick

最后,您可以删除临时容器/节点。

结果,您将拥有:

<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 + space,它将显示是否允许fx:include节点:

fx:include