当前位置: 首页 > 面试题库 >

从FXML加载控制器时出现IllegalArgumentException

南门意蕴
2023-03-14
问题内容

因此,我正在为学校项目编码此聊天客户端,现在我需要使用JavaFX实现GUI。我已经在Scene
Builder中构建了外观简洁的GUI。现在,无论何时客户端收到一条消息,它都应该在控制器中调用一个方法,以将接收到的字符串附加到TextField上。

但是,当我尝试从FXML文件加载控制器时,出现此错误:

null/../../../../img/jim.png
javafx.fxml.LoadException: 
unknown path:16

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)
at com.example.main.GUI.start(GUI.java:46)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
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$149(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:745)Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1100)
at javafx.scene.image.Image.<init>(Image.java:681)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:47)
at com.sun.javafx.fxml.builder.JavaFXImageBuilder.build(JavaFXImageBuilder.java:37)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:763)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532)
... 11 moreCaused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1092)
... 17 more

这是获取控制器并在其中调用方法的代码:

    try {
        FXMLLoader loader = new FXMLLoader();
        Pane p = loader.load(getClass().getResource("ChatForm.fxml").openStream());
        ChatForm chatForm = (ChatForm) loader.getController();
        chatForm.test();
    } catch (IOException e) {
        e.printStackTrace();
    }

最后,我的FXML文件:

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

<?import javafx.scene.text.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="410.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.main.ChatForm">
   <children>
      <VBox prefHeight="410.0" prefWidth="300.0">
         <children>
            <ImageView fitHeight="135.0" fitWidth="300.0" pickOnBounds="true" preserveRatio="true">
               <image>
                  <Image url="@../../../../img/jim.png" />
               </image>
            </ImageView>
            <TextArea fx:id="chatTextArea" editable="false" focusTraversable="false" prefHeight="232.0" prefWidth="300.0" wrapText="true" />
            <TextField fx:id="messageTextField" />
            <Label text="Skriv &quot;.disconnect&quot; för att logga ut">
               <font>
                  <Font size="10.0" />
               </font>
            </Label>
     </children>
  </VBox>

加载徽标图像时显然出现了奇怪的现象。有任何想法吗?

新年快乐!


问题答案:

FXML文件中的语法url="@..."指的是相对于当前FXMLLoader的location属性的路径。

但是,在加载FXML文件时,您不是在向FXMLLoader位置提供信息,而是向其提供输入流。因此,位置为null和(如堆栈跟踪所示),您的路径被解释为

null /../../../../ img / jim.png

要解决此问题,请将位置提供到FXMLLoader,而不是输入流:

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ChatForm.fxml"));
    Pane p = loader.load();
    ChatForm chatForm = (ChatForm) loader.getController();
    chatForm.test();
} catch (IOException e) {
    e.printStackTrace();
}

假设路径实际上是正确的,这将解决当前的问题。我认为您还有其他本质上不相关的问题,因为您似乎从未对加载的场景图做任何事情(即,您从未显示窗格p)。



 类似资料:
  • 我将StackPane作为根,并在主应用程序Start()方法中加载了BorderPane布局。在BorderPane布局中,我有两个按钮:一个用于添加fxml文件(Menu.fxml),另一个用于删除此文件。一旦菜单。fxml已加载,菜单中有一个按钮。fxml,单击时应在先前加载的BorderPane布局的中心加载一个fxml文件(One.fxml)。然而,在这个阶段,我得到了一个空指针异常。你

  • 问题内容: 当我在JavaFX中调用FXMLLoader#load()时会发生什么? 假设FXML控制器扩展了具有构造函数的类。是否可以保证构造函数将被调用?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,是否将调用TextField()构造函数? 我已经尝试过搜索这个,但是除了“从FXML文档中加载对象层次结构”之外,似乎没有关于它的文档。来自http://docs.oracle.co

  • 我已经试着搜索了这篇文章,但是除了“从FXML文档加载对象层次结构”之外,似乎没有关于它的文档。摘自http://docs.oracle.com/javafx/2/api/javafx/fxml/fxmlloader.html 你的回答将不胜感激。多谢!

  • 问题内容: 我有一个登录屏幕,我想将登录ID从LoginController传递到MainController,因此我可以访问一些功能来更改密码和其他功能。 我这样加载控制器: Main.fxml绑定到MainController.java。有没有一种方法可以传递所需的用户ID,并在控制器的initialize()方法上对其进行访问? 问题答案: 用FXMLLoader加载控制器后,可以在调用sh

  • 我这样加载控制器: fxml绑定到MainController.java。有没有一种方法可以传递我需要的用户ID,并在控制器的initialize()方法上访问它?

  • 在我的程序中,我有一个选项卡窗格,每个选项卡都有自己的FXML文件和控制器。我已经为选项卡2(Schedular)加载了FXML文件。我试图从父控制器(FXML文档)调用子控制器(调度程序)中的函数。当我使用FXML Loader加载控制器时,它返回null。我该如何解决这个问题。 这是我的主要代码: 主要FXML文档: