加载 FXML 文件的 JavaFX 异常

狮子座

我一直在开发一个需要使用 JavaFX 的桌面应用程序。我在使用 Scene Builder 构建的 Eclipse 上的 JavaFX 项目中创建了各种 FXML 文件。除了这个讨厌的文件 (FXMLImgList.fxml),我加载任何 FXML 文件都没有问题。

主要思想是当按下按钮时,会出现一个新窗口。这是该按钮的事件处理程序的代码:

@FXML
private void handleOnActionButtonImg(ActionEvent e) throws MalformedURLException, URISyntaxException
{
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/res/FXMLImgList.fxml").toURI().toURL());
    VBox root = null;
    try {
        root = (VBox) loader.load(); // ERROR LOADING HERE
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    ImgListController ilc = loader.getController();
    ilc.init(imgUrl);

    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner((Stage) vBox.getScene().getWindow());
    stage.setScene(scene);
    stage.setResizable(false);
    stage.setTitle("Elegir imagen");
    stage.show();
}

包资源管理器中的项目如下所示:

https://image.ibb.co/ihGMoS/Capture.png(不能发布图片)

我从 try-catch 块中得到这个异常:

javafx.fxml.LoadException:
/C:/Users/Ximo/Desktop/UNI/2017-2018%20(UPV)/IPC/EclipseWorkspaceIPC/PL03_Ej2/bin/res/FXMLImgList.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at application.VentanaController.handleOnActionButtonImg(VentanaController.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Invalid URL: unknown protocol: c
    at javafx.scene.image.Image.validateUrl(Image.java:1121)
    at javafx.scene.image.Image.<init>(Image.java:659)
    at application.ImgListController.initialize(ImgListController.java:64)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 61 more
Caused by: java.net.MalformedURLException: unknown protocol: c
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at java.net.URL.<init>(Unknown Source)
    at javafx.scene.image.Image.validateUrl(Image.java:1115)
    ... 64 more
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8413)
    at javafx.scene.control.Button.fire(Button.java:185)
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.Trampoline.invoke(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 48 more
Caused by: java.lang.NullPointerException: Root cannot be null
    at javafx.scene.Scene.<init>(Scene.java:336)
    at javafx.scene.Scene.<init>(Scene.java:194)
    at application.VentanaController.handleOnActionButtonImg(VentanaController.java:116)
    ... 58 more

更奇怪的是,其余的 FXML 文件加载得很好,例如这个:

@FXML
private void handleOnActionButtonMod(ActionEvent event) 
{
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/res/FXMLVentana.fxml"));
    VBox root = null;
    try {
        root = (VBox) loader.load(); // NO ERROR LOADING HERE
    } catch (IOException e) {
        e.printStackTrace();
    }
    VentanaController vac = loader.getController();
    vac.init(observablePersonData, table.getSelectionModel().selectedIndexProperty().getValue());
    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner(this.stage);
    stage.setScene(scene);
    stage.setResizable(false);
    stage.setTitle("Modificar");
    stage.show();
}

这个事件处理程序背后的想法几乎相同,按下按钮 -> 窗口打开并且工作正常。我已经尝试了很多这样的编辑返回的 URL,但似乎没有任何效果。

我注意到第 67 行的消息:

引起:java.lang.IllegalArgumentException:无效的 URL:未知的协议:c

然而结果是:

    System.out.println(getClass().getResource("/res/FXMLVentana.fxml"));
    System.out.println(getClass().getResource("/res/FXMLImgList.fxml"));

输出:

文件:/C:/Users/Ximo/Desktop/UNI/2017-2018%20(UPV)/IPC/EclipseWorkspaceIPC/PL03_Ej2/bin/res/FXMLVentana.fxml

文件:/C:/Users/Ximo/Desktop/UNI/2017-2018%20(UPV)/IPC/EclipseWorkspaceIPC/PL03_Ej2/bin/res/FXMLImgList.fxml

这是 FXMLImgList.fxml 的代码:

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox fx:id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="12.0" xmlns="        http://javafx.com/javafx/8.0.151" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ImgListController">
   <children>
      <HBox alignment="CENTER_RIGHT" spacing="12.0">
         <children>
            <Button fx:id="cancelar" mnemonicParsing="false" onAction="#handleOnActionButtonCancelar" text="Cancelar" />
            <Button fx:id="salvar" mnemonicParsing="false" onAction="#handleOnActionButtonSalvar" text="Salvar" />
         </children>
         <VBox.margin>
            <Insets />
         </VBox.margin>
      </HBox>
   </children>
   <padding>
      <Insets bottom="12.0" left="12.0" right="12.0" top="12.0" />
   </padding>
</VBox>

这是 FXMLVentana.fxml:

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>

<VBox fx:id="vBox" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="12.0" xmlns="http://javafx.com/javafx/8.0.151" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.VentanaController">
   <children>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
            <Label prefHeight="17.0" prefWidth="53.0" text="DNI" />
            <TextField fx:id="dni" />
         </children>
      </HBox>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
            <Label prefHeight="17.0" prefWidth="53.0" text="Nombre" />
            <TextField fx:id="nombre" />
         </children>
      </HBox>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
            <Label prefHeight="17.0" prefWidth="52.0" text="Apellidos" />
            <TextField fx:id="apellidos" />
         </children>
      </HBox>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
            <Label prefHeight="17.0" prefWidth="52.0" text="Ciudad" />
            <TextField fx:id="city" />
         </children>
      </HBox>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
            <Label prefHeight="17.0" prefWidth="52.0" text="Provincia" />
            <TextField fx:id="province" />
         </children>
      </HBox>
      <HBox alignment="CENTER" spacing="12.0">
         <children>
            <ImageView fx:id="imgView" fitHeight="80.0" fitWidth="80.0" onMouseClicked="#handleImgMouseClick" pickOnBounds="true" preserveRatio    ="true" />
        <Button     fx:id="buttonImg" mnemonicParsing="false" onAction="#handleOnActionButtonImg" text="Imagen" />
     </children    >
  </HBox    >
  <    HBox alignment="CENTER_RIGHT" spacing="12.0">
         <children>
            <Button fx:id="buttonCancelar" mnemonicParsing="false" onAction="#handleOnActionButtonCancelar" text="Cancelar" />
            <Button fx:id="buttonAction" mnemonicParsing="false" onAction="#handleOnActionButtonAction" text="Salvar" />
         </children>
      </HBox>
   </children>
   <padding>
      <Insets bottom="12.0" left="30.0" right="30.0" top="12.0" />
   </padding>
</VBox>

总之,我完全没有想法,我在网上找到的任何东西似乎都无法解决问题。任何帮助表示赞赏,谢谢!

费边

在您的堆栈跟踪中有 2 个例外。

在最后的一个简单表示root为空当您尝试将它传递给的构造函数Scene这是因为加载 fxml 失败。这不是因为 fxml url 无效,而是创建Image一个值不是 URL 作为ImgListController.initialize方法中的构造函数参数的结果可能你传递了一个绝对文件路径。

您可以使用FilePath类来获取文件的 URL:

File f = ...
URL url = f.toURI().toURL();
Image img = new Image(url.toExternalForm());

注意:如果发生异常,您不应该简单地继续处理您的逻辑,并且该方法的其余部分依赖于 try 块从无异常结束。这样你会得到 2 个例外,而不仅仅是一个。

替代方案是:

  • 重投

    throw new IllegalStateException("这不应该发生", e1);

  • 在向用户显示错误/记录错误后返回。
  • 等等...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

加载FXML文件时出现“需要位置”异常

来自分类Dev

加载FXML文件时出现“需要位置”异常

来自分类Dev

在JavaFX项目中加载fxml文件时出错

来自分类Dev

JavaFx FXML加载文件设置根问题

来自分类Dev

在JavaFX项目中加载fxml文件时出错

来自分类Dev

JavaFx FXML加载文件设置根问题

来自分类Dev

外部jar FXML加载异常

来自分类Dev

无法加载fxml文件

来自分类Dev

映射后加载fxml时出现javafx应用程序异常的spring

来自分类Dev

从另一个fxml文件的控制器加载fxml文件时,出现空点异常

来自分类Dev

Javafx将新的fxml文件加载到滚动窗格中

来自分类Dev

尝试将FXML文件加载到定制的JavaFX Game类(由教授制作)

来自分类Dev

如何在 JavaFX 应用程序中加载的 FXML 文件上显示元素?

来自分类Dev

发生异常:第二次加载fxml页面时Javafx中已指定根值

来自分类Dev

发生异常:第二次加载fxml页面时Javafx中已经指定了根值

来自分类Dev

JavaFX FXML:加载后为空白WebView

来自分类Dev

JavaFX使用FXML加载性能问题

来自分类Dev

JavaFx将其他FXML加载到FXML“模板”中

来自分类Dev

加载 fxml 时出现“javafx.fxml.LoadException”

来自分类Dev

如何加载* .jar文件之外的FXML文件

来自分类Dev

JavaFX如何设置FXML文件的样式

来自分类Dev

JavaFX无法在FXML文件中设置WebView

来自分类Dev

无法在Javafx中找到fxml文件

来自分类Dev

如何获取当前加载的fxml文件的名称?

来自分类Dev

如何在Pane中加载fxml文件?

来自分类Dev

如何获取当前加载的fxml文件的名称?

来自分类Dev

JavaFX不会像在fxml中那样加载css

来自分类Dev

JavaFX不会像在fxml中那样加载css

来自分类Dev

JavaFX Snake Thread.Sleep()无法加载FXML

Related 相关文章

热门标签

归档