【问题标题】:LoadException: Root value already specified on custom controlLoadException:已在自定义控件上指定根值
【发布时间】:2016-05-02 15:00:37
【问题描述】:

以下示例原因

javafx.fxml.LoadException: Root value already specified.

这里的代码是按照例子写的:http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm

代码:

public class NavigationView extends ButtonBar {

   private static final String defaultTemplate = "/fxml/navigator.fxml";

   public NavigationView() {
      this(null);
   }


   public NavigationView(URL resource) {
      //FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("custom_control.fxml"));

      if( resource == null ) {
         resource = getClass().getResource(defaultTemplate);
      }

      FXMLLoader fxmlLoader = new FXMLLoader(resource);
      fxmlLoader.setRoot(this);
      fxmlLoader.setController(this);

      try {
         fxmlLoader.load();
      } catch (IOException exception) {
         throw new RuntimeException(exception);
      }
   }

   public static class Runner extends Application {
      @Override
      public void start(Stage primaryStage) throws Exception {
         Scene scene = new Scene(new NavigationView(), 800, 600);
         primaryStage.setTitle("NavigationView");
         primaryStage.setScene(scene);
         primaryStage.show();
      }

      public static void main(String[] args) {
         Runner.launch(args);
      }
   }
}

如果我删除线

fxmlLoader.setRoot(this);

然后视图是空的,这很重要,因为NavigationView 和 FXML 模板之间没有任何联系。

如何实现?

更新

FXML 如下:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ButtonBar?>

<ButtonBar maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="38.0" prefWidth="651.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.91">
  <buttons>
    <Button fx:id="previousButton" mnemonicParsing="false" text="&lt;&lt; Previous" />
      <Button fx:id="nextButton" mnemonicParsing="false" text="Next &gt;&gt;" />
      <Button fx:id="editButton" mnemonicParsing="false" text="Edit" />
      <Button fx:id="createButton" mnemonicParsing="false" text="Create" />
      <Button fx:id="saveButton" mnemonicParsing="false" text="Save" />
      <Button fx:id="cancelButton" mnemonicParsing="false" text="Cancel" />
      <Button fx:id="deleteButton" mnemonicParsing="false" text="Delete" />
  </buttons>
</ButtonBar>

【问题讨论】:

    标签: java javafx-8 fxml fxmlloader


    【解决方案1】:

    使用"dynamic root"&lt;ButtonBar&gt; 元素是对FXMLLoaderButtonBar 类创建对象的指令,并且(因为它是 FMXL 文件的根元素)将其用作所创建结构的根。如果您想调用setRoot(this),您已经创建了一个将扮演该角色的对象。

    所以你应该使用:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.control.Button?>
    <?import javafx.scene.control.ButtonBar?>
    
    <fx:root type="ButtonBar" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="38.0" prefWidth="651.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.91">
      <buttons>
        <Button fx:id="previousButton" mnemonicParsing="false" text="&lt;&lt; Previous" />
          <Button fx:id="nextButton" mnemonicParsing="false" text="Next &gt;&gt;" />
          <Button fx:id="editButton" mnemonicParsing="false" text="Edit" />
          <Button fx:id="createButton" mnemonicParsing="false" text="Create" />
          <Button fx:id="saveButton" mnemonicParsing="false" text="Save" />
          <Button fx:id="cancelButton" mnemonicParsing="false" text="Cancel" />
          <Button fx:id="deleteButton" mnemonicParsing="false" text="Delete" />
      </buttons>
    </fx:root>
    

    【讨论】:

    • 但是如果我想使用&lt;ButtonBar&gt;呢?我通过在 FXML 之外创建额外的容器找到了解决方法。还有其他方法吗?
    • 这确实创建了一个按钮栏,因为您设置为根的对象是一个 ButtonBar 实例:NavigationView 扩展了 ButtonBar。
    • 我想问题是,如果你使用&lt;ButtonBar&gt;创建ButtonBar的子类,你有两个按钮栏。为什么要两个?
    猜你喜欢
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多