【问题标题】:changing path of javafx files in java在java中更改javafx文件的路径
【发布时间】:2018-11-27 13:21:55
【问题描述】:

我有一个 Maven 项目,我正在尝试使用 javafx(我正在使用 Eclipse) 我想更改文件的路径。我有

Parent root = FXMLLoader.load(getClass().getResource("/application/Main.fxml"));

这适用于下一个文件夹结构

src
  main
    java
      com
        projectFolder
           main.java
      application
        Main.fxml

但我想要类似的东西

src
  main
    java
      com
        projectFolder
           main.java
        application
           Main.fxml

我尝试了Parent root = FXMLLoader.load(getClass().getResource("/com/application/Main.fxml"));,但没有用。

我得到下一个错误

   [JavaFX Application Thread] ERROR com.application.Main - javafx.fxml.LoadException: 
/C:/Users/user/workspace/git/project/target/classes/com/application/Main.fxml:15

有人知道这是怎么回事吗?

【问题讨论】:

  • 你是如何运行你的应用程序的?
  • 运行方式/Java 应用程序
  • 请在您的 IDE 上截取目录结构的屏幕截图并将其添加到您的问题中,因为我需要了解您所说的 projectFolder 是什么意思,以及为什么在使用帮助程序时会出现双斜杠方法!
  • 我上传了文件夹结构。双斜杠是拼写错误,stackoverflow 不允许我编辑它

标签: java maven javafx maven-2


【解决方案1】:

我不推荐那种令人困惑的文件结构...

但在这种情况下,我相信您需要使用资源的相对路径:../application/Main.fxml

getClass().getResource() 期望资源与调用类位于同一目录中。不是,所以你需要 Java 来备份一个带有 .. 的目录

【讨论】:

  • 嗯,这实际上可以解决问题,但我很确定当您将项目导出到可执行 JAR 文件时,这将不起作用。至少我过去在使用相对路径时遇到了很多问题。
  • 你推荐什么结构?如果我做类似 FXMLLoader.load(getClass().getResource("../application/Main.fxml"));我收到其他类型的错误:java.lang.NullPointerException: Location is required.
【解决方案2】:

假设你我确实有如下图一样的项目结构:

为了加载 FXML 文件,您应该使用完整路径,如下例所示:

package main.java.com.projectFolder;

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

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/main/java/com/application/Main.fxml"));

        Parent root = loader.load();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

现在,如果您实际使用相对路径,例如:

FXMLLoader loader = new FXMLLoader(this.getClass().getResource("../application/Main.fxml"));

只要您通过 Eclipse 运行时环境编译和运行代码,上述操作也将起作用。当您将项目导出到 JAR 文件并尝试执行它时,您将得到与从一开始就遇到的相同错误。实际上,您可以在类似的帖子中了解这一点:It runs OK in Eclipse but not able to run as .jar file

编辑:对于 maven 项目,您应该考虑将 FXML 文件重新定位到您的 src/main/resources/ 文件夹。你可以在这篇文章中找到更多:JavaFX and maven: NullPointerException: Location is required

【讨论】:

  • 谢谢,但我的 FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/main/java/com/application/Main.fxml"));并且仍然收到此错误 [JavaFX Application Thread] ERROR com.application.Main - java.lang.NullPointerException: Location is required.
  • @andreasViena 有趣.. 在那种情况下,有两种可能性,要么这是一个 Maven/Gradle Java 项目,它以不同方式处理路径并且具有不同的项目结构,要么你没有相同的我拥有的项目结构,向我们展示您在 Eclipse 上的 Navigator View 的图片可能会有所帮助
  • 是的,我有同样的结构。我要去检查 maven 的东西
  • @AndreasViena 创建项目时选择“Java 项目”选项对吗?您使用的是哪个 IDE(Eclipse、InteliJ 等)?您正在运行什么 Java 版本?也许问题出在其他地方。
  • 这是一个专家项目。我正在使用 Eclipse,java 8
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 2012-04-21
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多