>我在相应的控制器中使用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()
方法,FXMLLoader
在给定位置解析 fxml 文件,初始化控制器并构造节点图。如果再次调用 loader.load()
方法,FXMLLoader
检测到根已设置,并引发"已指定根值"异常。
但是,一遍又一遍地调用 FXMLLoader
的 static load() 方法不会导致此异常。因为 fxml 文件解析和其他内容是从头开始执行的,独立于每次调用,在每次调用上。