需要Javafx位置(从其他文件夹/包加载FXML文件)

需要Javafx位置(从其他文件夹/包加载FXML文件),java,eclipse,nullpointerexception,javafx,fxml,Java,Eclipse,Nullpointerexception,Javafx,Fxml,我在使用Java处理FXML文件时遇到了一个问题 我现在搜索了几个小时,找不到任何能解决我问题的方法,所以我最后的希望是针对我的具体情况提出问题(我知道类似的问题和其他问题,但在这方面没有一个能真正帮助我) 简单解释:我有一个Eclipse Java项目,我的(对于这个问题很重要)类在包[Project Name]/src/measures.gui中。我的FXML文件在文件夹[Project Name]/resources中 加载FXML文件ElementsProperties.java的类如下

我在使用Java处理FXML文件时遇到了一个问题

我现在搜索了几个小时,找不到任何能解决我问题的方法,所以我最后的希望是针对我的具体情况提出问题(我知道类似的问题和其他问题,但在这方面没有一个能真正帮助我)

简单解释:我有一个Eclipse Java项目,我的(对于这个问题很重要)类在包[Project Name]/src/measures.gui中。我的FXML文件在文件夹[Project Name]/resources中

加载FXML文件ElementsProperties.java的类如下所示:

import java.io.IOException;

import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;

public class ElementsProperties {

  public static void show(Window parent, String title) {

    ElementsProperties el = new ElementsProperties();
    BorderPane root = el.loadFXMLFile("resources/TestWindow.fxml");

    Stage dialog = new Stage();
    dialog.initOwner(parent);
    dialog.setTitle(title);
    dialog.initModality(Modality.WINDOW_MODAL);
    dialog.setScene(new Scene(root));
    dialog.show();
  }

  @SuppressWarnings({ "finally", "static-access" })
  private BorderPane loadFXMLFile(String filePath) {
    BorderPane borderPane = null;
    try {
      borderPane = new BorderPane();
      FXMLLoader fxmlLoader = new FXMLLoader();
      Parent content = fxmlLoader.load(getClass().getResource(filePath));
      borderPane.setCenter(content);
    }
    catch (IOException e) {
      e.printStackTrace();
      System.err.println("Couldn't find the specified file");
    }
    catch(Exception e){
      e.printStackTrace();
    }
    finally {
     return borderPane;
    }
}}
FXML文件显示为带有以下简单行的对话框:
elementsprroperties.show(父级,“测试窗口”);

我的FXML文件(使用JavaFXSceneBuilder 2.0创建)如下所示: `

如果我将FXML文件移动到与主类相同的包中,即measurements.gui,并将ELementsProperties.java类的show方法中的文件路径更改为
“TestWindow.FXML”
,一切正常,我在应用程序中看到了创建的窗口。但我想将fxml文件放在单独的资源文件夹中,以便插入其他fxml文件

我希望我能清楚地解释我的问题,你能帮我解决这个问题。关于如何从不同于主类的包中加载fxml文件,有什么想法吗? 顺便说一句,我已经尝试过的是:

  • 将资源文件夹添加到类路径
  • 将路径设置为“/resources/TestWindow.fxml”(带正斜杠) 起初
  • 使用
    getClass().getClassLoader().getResource(文件路径)
    作为参数 对于FXMLLoader的加载方法

  • 提前谢谢。

    谢谢罗兰的链接。我试图复制文件夹结构,并提出了以下建议(适用于可能有相同问题的其他人):

    我创建了一个测试项目JavaFXTest。我在org.example.main包中有一个主类。该包通常位于项目的src文件夹中

    MyJavaFXDialog.java:

    package org.example.main;
    
    import java.io.IOException;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    
    public class MyJavaFXDialog extends Application{
    
        public void start(Stage primaryStage) {
    
        MyJavaFXDialog javaFx = new MyJavaFXDialog();
        BorderPane root = javaFx.loadFXMLFile("/resources/TestWindow.fxml");
    
        Stage dialog = new Stage();
        dialog.initModality(Modality.WINDOW_MODAL);
        dialog.setScene(new Scene(root));
        dialog.show();
        }
    
        @SuppressWarnings({ "finally", "static-access" })
        private BorderPane loadFXMLFile(String filePath) {
        BorderPane borderPane = null;
        try {
            borderPane = new BorderPane();
            FXMLLoader fxmlLoader = new FXMLLoader();
            Parent content = fxmlLoader.load(getClass().getResource(filePath));
            borderPane.setCenter(content);
        }
        catch (IOException e) {
            e.printStackTrace();
            System.err.println("Couldn't find the specified file");
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            return borderPane;
        }
        }
    
        public static void main(String[] args){
        launch(args);
        }
    }
    
    我在src文件夹中创建了一个普通文件夹“resources”。该资源文件夹只包含我的TestWindow.fxml文件,它与我上面的问题完全相同。 现在,当我启动应用程序时,fxml文件被找到并显示为主窗口

    因此,解决方案实际上是将resources文件夹移动到src文件夹中,这对我来说仍然是一个可行的解决方案。我只是不希望最终用户不得不在其他包的深处翻找来保存自己的fxml文件


    再次感谢Roland,为我指明了解决方案。

    我在这里的回答可能会有所帮助:……如果没有,请提供一个完整的可验证的例子,而不仅仅是你的一些问题。谢谢,@Roland!文件夹结构给了我所需的提示。对不起,如果我对我的问题不够清楚,我想我已经写了所有的东西了需要了解此问题。只需一条不相关的注释:
    fxmloader.load(URL)
    是一个静态方法;您没有在创建的
    fxmloader
    实例上调用它(您从未实际使用过该实例)。您应该删除
    fxmloader
    实例并以通常的方式调用静态方法:
    Parent content=fxmloader.load(…);
    (或者在
    fxmloader
    实例上设置位置并调用无参数
    load()
    方法)。实际上,我认为fxmloader的静态加载方法是(预定的)不推荐使用。这就是我选择这种方法的原因。对此进行了讨论,但我不知道是否已经决定了(可能已经决定了)。尽管如此,您的代码仍然调用静态方法。哦,您是对的……将改变这一点。感谢您的提示。FWIW不会将静态方法显示为不推荐使用的(尽管这可能会改变-我希望会改变)。
    java.lang.NullPointerException: Location is required.
    
    package org.example.main;
    
    import java.io.IOException;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Modality;
    import javafx.stage.Stage;
    
    public class MyJavaFXDialog extends Application{
    
        public void start(Stage primaryStage) {
    
        MyJavaFXDialog javaFx = new MyJavaFXDialog();
        BorderPane root = javaFx.loadFXMLFile("/resources/TestWindow.fxml");
    
        Stage dialog = new Stage();
        dialog.initModality(Modality.WINDOW_MODAL);
        dialog.setScene(new Scene(root));
        dialog.show();
        }
    
        @SuppressWarnings({ "finally", "static-access" })
        private BorderPane loadFXMLFile(String filePath) {
        BorderPane borderPane = null;
        try {
            borderPane = new BorderPane();
            FXMLLoader fxmlLoader = new FXMLLoader();
            Parent content = fxmlLoader.load(getClass().getResource(filePath));
            borderPane.setCenter(content);
        }
        catch (IOException e) {
            e.printStackTrace();
            System.err.println("Couldn't find the specified file");
        }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            return borderPane;
        }
        }
    
        public static void main(String[] args){
        launch(args);
        }
    }