Java 8 Eclipse 的 Root 尚未设置错误

Posted

技术标签:

【中文标题】Java 8 Eclipse 的 Root 尚未设置错误【英文标题】:Root hasn't been set Error with Java 8 Eclipse 【发布时间】:2014-02-13 11:05:02 【问题描述】:

最近我为我的 JavaFX 应用程序安装了 Java 8 build 124,我开始收到以下错误:

javafx.fxml.LoadException: Root hasn't been set. Use method setRoot() before load.
/Users/jonathan/Projects/Dominion/target/classes/dominion/application/controller/main_overview_tab.fxml:13

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$RootElement.constructValue(FXMLLoader.java:1320)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at dominion.application.controller.MainOverviewTab.initView(MainOverviewTab.java:64)
at dominion.application.controller.MainOverviewTab.initializeController(MainOverviewTab.java:55)
at dominion.application.controller.GameSetupController.<init>(GameSetupController.java:37)
at dominion.application.controller.DashboardController.<init>(DashboardController.java:40)
at dominion.application.controller.MainController.<init>(MainController.java:37)
at dominion.application.Dominion.start(Dominion.java:18)
at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

javafx.fxml.LoadException: Root hasn't been set. Use method setRoot() before load.
/Users/jonathan/Projects/Dominion/target/classes/dominion/application/controller/players_tab.fxml:13

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2613)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:104)
at javafx.fxml.FXMLLoader$RootElement.constructValue(FXMLLoader.java:1320)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2723)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at dominion.application.controller.PlayersTab.initView(PlayersTab.java:46)

我的应用程序在 Java 7 build 40 和 51 下运行良好,但在 Java 8 build 124 下却不行。这是我的 main_overview_tab.fxml 文件的前几行:

<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" fx:id="content" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-1.0" minWidth="-1.0" prefHeight="600.0" prefWidth="1000.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
<children>
<VBox prefHeight="-1.0" prefWidth="-1.0" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
  <children>
    <HBox prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
      <children>
        <VBox id="playersVBox" prefHeight="-1.0" prefWidth="-1.0" spacing="40.0" HBox.hgrow="ALWAYS">
          <children>
            <Label text="Players">
              <font>
                <Font size="18.0" fx:id="x3" />
              </font>
              <VBox.margin>
                <Insets />
              </VBox.margin>
            </Label>

这个问题非常相似,但似乎对我的情况没有帮助:JavaFX SceneBuilder 2.0 doesn't open FXML for custom components with fx:root as main layout tag。

编辑:加载 FXML 的代码

public class MainOverviewTab extends Tab implements IObserver 
  @FXML public AnchorPane content;

  private SingleGameSettings gameSettings;
  private List<ImageView> overviewImages;

  public MainOverviewTab() 
  

  public void initializeController(SingleGameSettings gameSettings) 
      this.gameSettings = gameSettings;
      this.gameSettings.registerObserver(this);

      initView();
  

  private void initView() 
      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main_overview_tab.fxml"));
      fxmlLoader.setRoot(content);
      fxmlLoader.setController(this);

      try 
          fxmlLoader.load();
      
      catch (Exception e) 
          e.printStackTrace();
      

      this.setText("Overview Game");
      this.setContent(content);

  
  ...

【问题讨论】:

显示加载fxml的java代码 从 fxml 中移除 解决了这个问题:***.com/a/21076712/3231870 【参考方案1】:

从 Scene Builder-> Document -> Controller 中取消选中 fx:root 构造,或从 fxml 文件的代码中删除

【讨论】:

它正在工作,我从场景构建器中删除了未选中 它也对我有用。只需确保在 Eclipse 上执行 Project > Clean..。谢谢!

以上是关于Java 8 Eclipse 的 Root 尚未设置错误的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse中jframe怎么用属性设背景图片

eclipse创建android项目,我想给背景设为自定义图片且全屏,但是结果出来图片四周总是有空白,怎么破?

Ubuntu 下Eclipse 安装SVN

Eclipse 不适用于 java 8 和 win 8 [重复]

第8天 Java基础语法

08_Java基础语法_第8天(Eclipse)_讲义