上善若水含洪八埏 2024-05-30 20:01 采纳率: 33.3%
浏览 19
已结题

JavaFX启动SceneBuilder报错,找不到fxml文件

在使用JavaFX启动SceneBuilder时报错,显示fxml文件路径为空,以下是报错

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at javafx.graphics@21.0.3/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics@21.0.3/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics@21.0.3/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at javafx.graphics@21.0.3/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.lang.RuntimeException: Could not find FXML file:D:\文档\IDEA\JavaFx\src\JavaFxStudent\JavaFxml\JavaFX.fxml
    at JavaFxStudent.Main.changeView(Main.java:39)
    at JavaFxStudent.Main.start(Main.java:31)
    at javafx.graphics@21.0.3/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at javafx.graphics@21.0.3/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at javafx.graphics@21.0.3/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at javafx.graphics@21.0.3/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at javafx.graphics@21.0.3/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at javafx.graphics@21.0.3/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@21.0.3/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    ... 1 more
Exception running application JavaFxStudent.Main

这个是项目格式图:

img

img

img

img

img

img

img


电脑环境变量图

img

这个是Login登陆界面类的源代码:

package JavaFxStudent.JavaFXImpl;

import javafx.fxml.FXML;
import javafx.scene.control.Button;

import java.awt.event.ActionEvent;

/**
 * @program: JavaFx
 * @ClassName Logins
 * @description(类信息): 登陆界面
 * @author: honor
 * @create: 2024-05-30 11:32
 * @Version 1.0
 **/
public class Logins {

    @FXML
    private Button button;


    @FXML
    public void handButtonClick(javafx.event.ActionEvent actionEvent) {
        System.out.println("Button clicked!");
    }
}

这个是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 prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="JavaFxStudent.JavaFXImpl.Logins">
    <children>
        <Label layoutX="144.0" layoutY="116.0" prefHeight="101.0" prefWidth="271.0" text="Fuck"/>
        <Button layoutX="187.0" layoutY="209.0" mnemonicParsing="false" prefHeight="71.0" prefWidth="196.0"
                text="Buttons" onAction="#handButtonClick"/>
    </children>
</AnchorPane>

这个是测试类源代码:

package JavaFxStudent;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;
import java.net.URL;

/**
 * @program: JavaFx
 * @ClassName Main
 * @description(类信息): 测试类
 * @author: honor
 * @create: 2024-05-30 11:30
 * @Version 1.0
 **/
public class Main extends Application {
    private static Stage stage;

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

    @Override
    public void start(Stage stage) throws Exception {
        Main.stage = stage;
        stage.setTitle("Fuck");
        changeView("D:\\文档\\IDEA\\JavaFx\\src\\JavaFxStudent\\JavaFxml\\JavaFX.fxml");
        stage.show();
    }

    public static void changeView(String fxml) {
        Parent root = null;
        try {
            URL reso = Main.class.getClassLoader().getResource(fxml);
            if (reso == null) throw new RuntimeException("Could not find FXML file:" + fxml);
            root = FXMLLoader.load(reso);
            stage.setScene(new Scene(root));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

找了一圈修不好,同样的代码文件在他人电脑上能运行在我这就不行了

  • 写回答

7条回答 默认 最新

  • 专家-皆知 2024-05-30 20:03
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    从你提供的错误信息来看,问题出在加载FXML文件时找不到指定路径的资源。根据你的描述,其他电脑上可以正常运行,但在你的电脑上却出现了问题,这可能与资源路径、环境配置或者IDE设置有关。下面我会提供一些排查和解决步骤。

    1. 检查资源路径

    你的代码中硬编码了FXML文件的绝对路径,这是不推荐的做法,因为不同的系统或环境路径可能有差异,导致问题。应该使用类路径资源加载方式。首先尝试修改changeView方法中的资源获取逻辑。

    修改前代码片段:

    URL reso = Main.class.getClassLoader().getResource(fxml);
    

    修改后代码片段:

    将文件路径改为相对于类路径的相对路径。假设你的JavaFX.fxml文件位于src/JavaFxStudent/JavaFxml/目录下,那么正确的路径应该是:

    String fxmlPath = "/JavaFxStudent/JavaFxml/JavaFX.fxml";
    URL reso = Main.class.getResource(fxmlPath);
    

    注意前面的斜杠/表示从类路径根开始查找。

    2. 配置IDEA

    确保IDEA正确配置了资源目录。根据你的项目结构图,检查以下几个方面:

    • 模块设置:确保src目录被正确标记为“源代码”。
    • 资源目录:FXML文件所在的目录应该被识别为资源目录。如果需要,手动设置资源目录。

    3. 清理和重建项目

    有时候IDEA的索引或缓存可能会导致问题。尝试以下操作:

    • 清理项目:通过菜单Build -> Clean Project
    • 重建项目:通过菜单Build -> Rebuild Project
    • 重启IDEA:有时候重启IDEA可以解决索引问题。

    4. 检查库和依赖

    确保你的项目中正确地引用了JavaFX库,并且版本兼容。你已经展示了库的配置,看起来没有问题,但确保所有必要的JavaFX jar包都已添加到项目的库中。

    5. 运行时参数

    你的运行配置中指定了--module-path--add-modules参数,确保这些参数正确无误,并且指向正确的JavaFX SDK路径。

    修改后的Main类代码示例:

    package JavaFxStudent;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    import java.io.IOException;
    
    public class Main extends Application {
        private static Stage stage;
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            Main.stage = stage;
            stage.setTitle("Fuck");
            changeView("/JavaFxStudent/JavaFxml/JavaFX.fxml"); // 修改加载路径
            stage.show();
        }
    
        public static void changeView(String fxmlPath) {
            Parent root = null;
            try {
                URL reso = Main.class.getResource(fxmlPath);
                if (reso == null) throw new RuntimeException("Could not find FXML file:" + fxmlPath);
                root = FXMLLoader.load(reso);
                stage.setScene(new Scene(root));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    尝试以上步骤,看看是否能解决你的问题。如果问题依旧,可能需要进一步检查IDEA的日志文件或系统环境变量是否有潜在冲突。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 6月7日
  • 已采纳回答 5月30日
  • 创建了问题 5月30日

悬赏问题

  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞
  • ¥15 请帮我看一下这个简易化学配平器的逻辑有什么问题吗?
  • ¥15 暴力法无法解出,可能要使用dp和数学知识