JavaFX-将FXML加载到FXML中而不包含

JavaFX-将FXML加载到FXML中而不包含,javafx,fxml,Javafx,Fxml,我在相应的控制器中有一个用FXML创建的窗口,我有一个按钮,当单击特定的按钮时,它会加载一个小框。这个盒子也是使用FXML设计的 当我加载该框并希望将其添加到窗口中时,出现以下错误: javafx.fxml.LoadException: Root value already specified. at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2362) at javafx.fxml.FXMLLoader.proce

我在相应的控制器中有一个用FXML创建的窗口,我有一个按钮,当单击特定的按钮时,它会加载一个小框。这个盒子也是使用FXML设计的

当我加载该框并希望将其添加到窗口中时,出现以下错误:

javafx.fxml.LoadException: Root value already specified.
    at javafx.fxml.FXMLLoader.createElement(FXMLLoader.java:2362)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2311)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
    at com.clientgui.DataPage.openStaticData(DataPage.java:79)
...
这是我的代码:

private void openStaticData(int dataObjectId, String titel)
{
    try
    {
        URL location = getClass().getResource("StaticDataBox.fxml");
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(location);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.load();
        final Region page = (Region) loader.load();  //line 79

        StaticDataBox staticDataBox = (StaticDataBox) loader.getController();
        staticDataBox.setDataObjectId(dataObjectId);
        staticDataBox.setTitel(titel);

        Platform.runLater(new Runnable()
        {
            @Override
            public void run()
            {
                getChildren().add(page);
            }
        });

    } catch (IOException ex)
    {
        Logger.getLogger(DataPage.class.getName()).log(Level.SEVERE, null, ex);
    }
}
主窗口FXML:

<fx:root type="javafx.scene.layout.StackPane" xmlns:fx="http://javafx.com/fxml" fx:controller="com.clientgui.ClientGUI" prefHeight="675" prefWidth="1200.0" fx:id="root" styleClass="root">
...
</fx:root>

...
我要动态创建的框的FXML:

<VBox id="VBox" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.clientgui.StaticDataBox" styleClass="data-box">
...
</VBox>

...

您使用的是实例化版本的
FXMLLoader
,即它的非静态
load()
方法。该方法要求在调用之前设置位置,如其javadoc中所述。因此,通过调用
loader.load()
方法,
fxmloader
在给定位置解析fxml文件,初始化控制器并构造节点图。如果再次调用
loader.load()
方法,
FXMLLoader
检测到根目录已设置,并抛出“根目录值已指定”。异常。

但是反复调用
fxmloader
的static load()方法不会导致此异常。因为fxml文件解析和其他工作都是在每次调用时从零开始重新执行的,每次调用都是独立的。

您可以删除第78行,然后重试吗?这很有效!伟大的但是loader.load()是如何导致这个问题的呢?