当前位置: 首页 > 知识库问答 >
问题:

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

齐奕
2023-03-14

我在相应的控制器中有一个用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>

共有1个答案

巫晋鹏
2023-03-14

您使用的是实例化版本的fxmloader,即它的非静态load()方法。该方法要求在调用之前设置位置,如其javadoc中所述。因此,通过调用loader。load()method,FXMLLoader在给定位置解析fxml文件,初始化控制器并构造节点图。如果加载程序。load()方法再次调用时,fxmloader检测到根已设置,并抛出“根值已指定”例外
但是反复调用fxmloader的static load()方法不会导致此异常。因为fxml文件解析和其他工作都是从头开始,在每次调用中独立地执行的。

 类似资料:
  • 我的应用程序有选项卡式窗格,所以为了保持fxml文件的可管理性,我有一个包含选项卡的主fxml文件,并为每个其他选项卡单独设置一个fxml。这很好,但出于某种原因,应用程序已经停止加载第二个标签。我试着在主应用程序中单独加载它,效果很好。我尝试创建一个新的fxml文件作为测试,并加载它,这也是有效的。但是,它不会将其加载到第二个选项卡中。此外,控制台没有输出。 第二个: 很抱歉代码太长,并提前感谢

  • 我需要创建许多不同的FXML文件,每个文件都有一个一致的布局。每一个都有一个锚烷,可以容纳不同的内容物。 有没有办法加载一个“基本”FXML文件,然后加载第二个FXML文件,并将数据路由到第一个FXML文件? 例如,FXML#1有一个边框。FXML#2有一个按钮,文本字段,标签等。如何加载#1,然后加载#2作为#1的孩子?

  • 项目/ SRC/ 主/ Java/ 资源/ baselayout.fxml 不是应该有用吗?我本来工作得很好,但突然就不是了。我不知道还能做什么。

  • 当查看JavaFX SceneBuilder时,它能够加载任何类型的FXML。则忽略根节点或控制器。scenebuilder能够加载任何类型的fxml并显示其组件。 有没有人想要一种方法来加载一个fxml,而不考虑其字段的ID、控制器或根节点的类型? 问题是,当我尝试加载任何fxml时,它只能加载,如果我设置了正确的根类型。我想(通过FileChooser)将我能找到的任何FXML加载到(比方说)

  • 出于某种原因,当我尝试加载不同包中的FXML时,我得到了一个错误: 主应用程序。爪哇“ 文件夹结构: 错误消息:

  • 大家好,我是fxml的新手,所以请忽略我的愚蠢的问题,这里有几个东西,我尝试了两天,但没有成功 > 从表中删除空白,即表大小应达到可用行数(行数不同) 当用户单击表行(任何显示值)时,新的fxml文件将在定位窗格(显示tableview)中打开,分配给tableview,但我想在主视图中显示它(这里显示的是整个表和两个文本字段以及主堆栈后面的搜索按钮)主视图(其他只有标题和侧栏的fxml文件) 如