首页 > 解决方案 > JavaFX 在同级目录中打开资源

问题描述

我正在尝试构建我的项目,以便在单个文件夹中没有我的应用程序的所有源,但我在加载 fxml 文件时遇到问题。

我的项目结构

-Project
    -MainMenu
        -MainMenu.fxml
        -MainMenuController.java
    -ChildMenu
        -ChildMenu.fxml
        -ChildMenuController.java

我似乎无法从MainMenuController.java类加载ChildMenu.fxml文件。这是我尝试过的

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

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

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

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

Parent root = FXMLLoader.load(getClass().getResource("ChildMenu.fxml"));

我也尝试搜索堆栈溢出和谷歌,但没有找到任何解决该问题的方法。

这是我正在使用的图片,我在上面简化了我的问题,但似乎没有帮助。

在此处输入图像描述

NetBeans 将项目构建到一个临时 Jar 中,因此使用完整路径应该可以工作,但目前不行,如果您看到构建的输出/运行系统显示我所在位置的完整路径

C:\Users\Tyler\Documents\NetBeansProjects\InventoryManagementUI

但是,如果您实际上查看构建日志,它会说它是在其中构建/运行 jar C:\Users\Tyler\Documents\NetBeansProjects\InventoryManagementUI\dist\run96470141\InventoryManagementUI.jar

我一定遗漏了一些明显的东西。

为了完整起见,这是我的 openWindow 方法

   public void openWindow(String window, Stage stage) {
    try {

        Parent root = FXMLLoader.load(getClass().getResource(window));
        Scene scene = new Scene(root);

        System.out.println("Show scene");
        stage.initModality(Modality.APPLICATION_MODAL);
        stage.setScene(scene);
        stage.show();
    } catch (Exception e) {
        System.out.println("Failed to open new window: " + e.getMessage());
        e.printStackTrace();
    }
}

标签: javajavafxnetbeansfxml

解决方案


修复方法是从类路径的开头开始,使用前导正斜杠,如下所示:

 Parent root = FXMLLoader.load(getClass().getResource("/inventorymanagementui/AddPartMenu/AddPartMenu.fxml"));

推荐阅读