为什么我得到javafx.fxml.LoadException甚至fxml文件的路径都是正确的

时间:2015-03-04 00:15:13

标签: javafx fxml fxmlloader

我得到了

  

javafx.fxml.LoadException:

当我使用以下代码行加载和fxml文件时。

  

AnchorPane anchorPane =(AnchorPane)loader.load()

这是我的fxml文件,不包括import语句。

<AnchorPane prefHeight="537.0" prefWidth="374.0"     xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.buddhikajay.controller.NewTransactionDialogController">
   <children>
      <GridPane hgap="5.0" layoutX="30.0" layoutY="10.0" prefHeight="544.0" prefWidth="314.0" vgap="5.0">
    <columnConstraints>
      <ColumnConstraints hgrow="SOMETIMES" maxWidth="142.0" minWidth="10.0" prefWidth="69.0" />
      <ColumnConstraints hgrow="SOMETIMES" maxWidth="226.0" minWidth="10.0" prefWidth="225.0" />
    </columnConstraints>
    <rowConstraints>
      <RowConstraints maxHeight="70.0" minHeight="10.0" prefHeight="33.0" vgrow="SOMETIMES" />
      <RowConstraints maxHeight="105.0" minHeight="10.0" prefHeight="38.0" vgrow="SOMETIMES" />
      <RowConstraints maxHeight="156.0" minHeight="10.0" prefHeight="51.0" vgrow="SOMETIMES" />
        <RowConstraints maxHeight="154.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" />
        <RowConstraints maxHeight="160.0" minHeight="10.0" prefHeight="43.0" vgrow="SOMETIMES" />
        <RowConstraints maxHeight="161.0" minHeight="10.0" prefHeight="63.0" vgrow="SOMETIMES" />
        <RowConstraints maxHeight="301.0" minHeight="10.0" prefHeight="180.0" vgrow="SOMETIMES" />
        <RowConstraints maxHeight="231.0" minHeight="10.0" prefHeight="106.0" vgrow="SOMETIMES" />
    </rowConstraints>
     <padding>
        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
     </padding>
     <children>
        <Label text="ID" />
        <Label text="Date" GridPane.rowIndex="1" />
        <Label text="Amont" GridPane.rowIndex="2" />
        <Label text="Person" GridPane.rowIndex="4" />
        <Label text="Type" GridPane.rowIndex="3" />
        <Label text="Resolved" GridPane.rowIndex="5" />
        <Label />
        <Label text="Description" GridPane.rowIndex="6" />
        <TextField fx:id="idTextField" GridPane.columnIndex="1" />
        <TextField fx:id="dateTextField" GridPane.columnIndex="1" GridPane.rowIndex="1" />
        <TextField fx:id="amountTextField" GridPane.columnIndex="1" GridPane.rowIndex="2" />
        <TextArea fx:id="descriptionTextArea" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="6" />
        <HBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="225.0" spacing="20.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
           <GridPane.margin>
              <Insets />
           </GridPane.margin>
           <padding>
              <Insets bottom="10.0" left="20.0" right="10.0" top="10.0" />
           </padding>
           <children>
              <Button fx:id="okButton" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#okActionFired" prefHeight="25.0" prefWidth="75.0" text="Ok" />
              <Button fx:id="cancleButton" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" onAction="#cancleActionFired" prefHeight="25.0" prefWidth="75.0" text="Cancle" />
           </children>
        </HBox>
        <ComboBox fx:id="typeComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
        <ComboBox fx:id="personComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="4" />
        <ComboBox fx:id="resolvedComboBox" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="5" />
     </children>
  </GridPane>
  </children>
</AnchorPane>

编译器抱怨行号1有错误。我确定fxml文件的路径是正确的。我的代码出了什么问题?

这是完整的错误堆栈

javafx.fxml.LoadException: 
/C:/Users/Buddhika/Documents/Programming/IdeaProjects/VirtualCreditDesktop/out/production/VirtualCreditDesktop/com/buddhikajay/view/NewTransactionDialog.fxml:9

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2595)
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:104)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:928)
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:967)
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2701)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2521)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2403)
    at com.buddhikajay.controller.NewTransactionDialogController.showNewTransactionDialog(NewTransactionDialogController.java:68)
    at com.buddhikajay.controller.MainApp.start(MainApp.java:51)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(LauncherImpl.java:821)
    at com.sun.javafx.application.LauncherImpl$$Lambda$50/1976027283.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(PlatformImpl.java:323)
    at com.sun.javafx.application.PlatformImpl$$Lambda$46/301541210.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/474926796.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/1662429848.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
    at com.sun.glass.ui.win.WinApplication$$Lambda$38/519284171.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.InstantiationException: com.buddhikajay.controller.NewTransactionDialogController
    at java.lang.Class.newInstance(Class.java:423)
    at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:923)
    ... 23 more
Caused by: java.lang.NoSuchMethodException: com.buddhikajay.controller.NewTransactionDialogController.<init>()
    at java.lang.Class.getConstructor0(Class.java:3074)
    at java.lang.Class.newInstance(Class.java:408)
    ... 25 more

2 个答案:

答案 0 :(得分:7)

问题在堆栈跟踪中描述:

Caused by: java.lang.NoSuchMethodException: com.buddhikajay.controller.NewTransactionDialogController.()

基本上说你的控制器类没有零参数构造函数。

默认情况下,FXMLLoader将通过调用其零参数构造函数来创建控制器。删除在控制器类中定义的构造函数,或删除它所采用的参数。

如果你真的需要将参数传递给控制器​​的构造函数,你可以用Java代码创建控制器并将其传递给FXMLLoader:

NewTransactionDialogController controller = new NewTransactionDialogController(someValue);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(...);
loader.setController(controller);
AnchorPane anchorPane = loader.load();

(使用此代码,您必须从FXML中删除fx:controller属性。)

或者,设置控制器工厂:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(...);
loader.setControllerFactory(clazz -> {
    if (clazz == NewTransactionDialogController.class) {
        return new NewTransactionDialogController(someValue);
    } else {
        // default behavior:
        try {
            return clazz.newInstance();
        } catch (Exception exc) {
            throw new RuntimeException(exc);
        }
    }
});

AnchorPane anchorPane = loader.load();

(在此版本中,将fx:controller属性保留在FXML文件中。)

答案 1 :(得分:0)

@James_D对我的评论提出了一个不同的问题,因为直到我在这个问题上阅读FXML的第一行,我认为我有一个不同的问题。

对于我的罪过,我将挑战简化为单个控制器和两个FXML文件的简单示例。一个工作,第二个失败/失败。

起点是Netbeans样本&#34; [点击我!]&#34;样品。代码粘贴在下面。并且,首先是一个解决方案。

作为序言,让我说,似乎每个人一直在责备Java控制器以应对这些负载错误。几年前,我在一个项目中遇到过这样的一堆错误。我们筋疲力尽&#34; 控制器&#34;调试并最终通过使用ScendBuilder重新构建FXML屏幕来推进。那时我没有时间进一步调查。

上周我完美地工作FXML屏幕开始无法加载,因为我们将其移动到运行时目录(之前它位于JAR资源区域中)。

KLUNK!

经过3或4天的调整后,我在这里就我的错误做了评论:

  • unknown path: 7
  • Javafx fxml LoadException: Error resolving onAction='#handleButtonAction', either the event handler is not in the Namespace or there is an error in the script.

仅限&#34; 简单 .fxml &#34;文件,但不是&#34; 场景 .fxml &#34;文件。文件&#34; simple.fxml&#34;从最初产生问题的应用程序FXML文件减少。原始文件上的变量太多,所以剁剁剁以匹配罐装演示。

当你只使用这个时:

xmlns:fx="http://javafx.com/fxml"

FXML load-s来自应用程序文件夹下的磁盘上的文件就像你想要的那样工作(好吧,就像我想要的那样)。看看上面的FXML,它正在使用更多的脆弱的&#39;命名空间,即。

Queston的原始FXML:

  <AnchorPane ...
              xmlns="http://javafx.com/javafx/8" 
              xmlns:fx="http://javafx.com/fxml/1" ... >

通过使用diff,我慢慢变形了&#34; simple.fxml&#34;尽可能接近&#34; Scene.fxml&#34;和&#34;简单&#34;只是一直无法加载。请注意;总是使用相同的控制器

使用其他元数据加载FXML并未始终如一地移动FXML文件。我没有解释 这是怎么回事。

FXML保存在名为&#34; test / resources / fxml / simple.fxml&#34;的目录中。例如。当我在项目JAR中使用这两个文件构建时,&#39; 相同 &#39;在两种情况下FXML都按预期加载和工作。对我来说,有一些关于文件加载进程方面没有说的话。同样对我来说,这是不可取的,因为外部场景定义的KEY值将是互换的。

这些带有XML标记的熊陷阱(显然)没有被像SceneBuilder或FXMLLoader()这样的开发工具所吸收,这些都是实现项目进展的障碍,这些项目不会让我们调查深奥em>怪异就像这样。

我们以前的项目经验证明了这一点 - 我更容易使用SceneBuilder整体重新编辑复杂的屏幕,而不是追踪像这样的负载问题。行动呼吁是: FXML加载诊断 - FXML Lint 几乎是一项要求。

Controller, SimpleController .java:

  package ex.view.views;

  import java.net.URL;
  import java.util.ResourceBundle;
  import javafx.event.ActionEvent;
  import javafx.fxml.FXML;
  import javafx.fxml.Initializable;
  import javafx.scene.control.Label;

  public class SimpleController implements Initializable {

      @FXML
      private Label label;

      @FXML
      private void handleButtonAction(ActionEvent event) {
          System.out.println("You clicked me!");
          label.setText("Hello World!");
      }

      @Override
      public void initialize(URL url, ResourceBundle rb) {
          // TODO
      }    
  }

失败的FXML开始作为Maven原型之一(我认为)并且该文件正常工作,直到我将FXML文件移动到文件夹并从InputStream加载它们。

为了便于阅读,我在多行上格式化了 AnchorPane 标记。

simple.fxml:

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

  <?import javafx.scene.control.Button?>
  <?import javafx.scene.control.Label?>
  <?import javafx.scene.layout.AnchorPane?>

  <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" 
              xmlns="http://javafx.com/javafx/8.0.65" 
              xmlns:fx="http://javafx.com/fxml/1"
               fx:controller="ex.view.views.SimpleController">
      <children>
          <Button fx:id="button" layoutX="126" layoutY="90" text="Click Me!" />
          <Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
      </children>
  </AnchorPane>

有效的FXML标记来自Netbeans 8.1样本。

Scene.fxml:

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

  <?import java.lang.*?>
  <?import java.util.*?>
  <?import javafx.scene.*?>
  <?import javafx.scene.control.*?>
  <?import javafx.scene.layout.*?>

  <AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" 
              xmlns:fx="http://javafx.com/fxml" 
              fx:controller="ex.view.views.SimpleController">
      <children>
          <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
          <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
      </children>
  </AnchorPane>