Ошибка при загрузке файлов fxml из папки, отличной от bin.

Я довольно новый программист на Java. У меня всего около пяти недель опыта, начиная с нуля, и у меня возникают проблемы с правильной загрузкой файлов javafx fxml, созданных в Scene Builder, если они не находятся в той же папке, что и классы контроллеров.

Я использую

Win7x64 running jre7x86 for this build

Eclipse Juno Service Release 1
Build id: 20120920-0800

jre version 1.7.0_07

javaFx version 2.2.1-b03

SceneBuilder version 1.0-b50

Мой код загрузчика сцены

private static final String RESOURCE_PATH = "/resources/";
public static Stage buildStage(@SuppressWarnings("rawtypes") Class pClass,
         String stageTitle, String resourceLocation)
   {
      Stage temp = new Stage();
      Pane page = null;
      try
      {
         page = FXMLLoader.load(pClass.getResource(RESOURCE_PATH + resourceLocation), null,
               new JavaFXBuilderFactory());
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
      Scene scene = new Scene(page);
      temp.setScene(scene);
      temp.setTitle(stageTitle);
      temp.setResizable(false);
      return temp;
   }

Я знаю, что каталог проекта - это /workspace/projectName/, поэтому теоретически загрузчик должен иметь возможность находить файлы, если ему задан относительный путь, верно? Я получаю ошибку

Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2737)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2721)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2707)
    at outofunit.system.StageFactory.buildStage(StageFactory.java:32)
    at outofunit.desktop.ArcMaster.start(ArcMaster.java:28)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    ... 1 more

Я также пробовал указать загрузчику абсолютный путь, но он просто не принимает ничего, что не находится непосредственно в том же каталоге. Я хватаюсь за соломинку, пытаясь понять это.

Я пытался исследовать это самостоятельно, но у меня не было многого, несколько ответов здесь, которые казались похожими, похоже, не помогли, или я слишком тупой и / или неопытен, чтобы понять их. Это JavaFX 2.0, загрузка файлов fxml с обработчиками событий не выполняется и Ошибка загрузки ресурса JavaFX 2.0 FXML

Мой приятель смог решить эту проблему с помощью этого кода

public void load(String pFileName, Stage pStage, String pTitle)
   {
      String fName = RESOURCE_PATH + pFileName;

      try
      {
         String externalForm = getClass().getResource(fName)
            .toExternalForm();

         InputStream inStream = new URL(externalForm).openStream();

         FXMLLoader loader = new FXMLLoader();
         Pane p = (Pane)loader.load(inStream);

         pStage.setTitle(pTitle);
         pStage.setScene(new Scene(p));

         mWindowControl = loader.getController();
         mWindowControl.setUp(pStage);

         pStage.show();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }

Самая большая разница и причина, по которой я не использовал его код, заключается в том, что моя корневая панель - это панель привязки, а не обычная панель, а его способ URL-адреса instream вызывает обычную панель. Я виноват в том, что не использовал обычную панель в качестве основы? Я хотел бы получить любую помощь или информацию, которую вы можете дать. Спасибо.

Изменить: Итак, я работал над этой проблемой, и сообщение об ошибке изменилось.

Я изменил код на этот

private final String RESOURCE_PATH = "resources/";
public void load(String pFileName, Stage pStage, String pTitle)
   {
      String fName = RESOURCE_PATH + pFileName;

      Pane page = null;

      FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(fName));

      try
      {
         page = (Pane) fxmlLoader.load();
      }
      catch (IOException exception)
      {
         throw new RuntimeException(exception);
      }

      Scene scene = new Scene(page);
      pStage.setScene(scene);
      pStage.setTitle(pTitle);

      mWindowControl = fxmlLoader.getController();
      mWindowControl.setUp(pStage);

      pStage.show();
   }

но ошибка, которую я сейчас получаю,

java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2021)
    at outofunit.desktop.WindowLoader.load(WindowLoader.java:136)
    at outofunit.desktop.WindowLoader.load(WindowLoader.java:62)
    at outofunit.desktop.ArcMaster.start(ArcMaster.java:30)
    at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
    at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
    at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    at java.lang.Thread.run(Unknown Source)

Я не понимаю, как не устанавливается местоположение


person Samuel    schedule 09.12.2012    source источник


Ответы (3)


Оба исключения говорят: «Файл (FXML), который вы пытаетесь загрузить, не может быть найден в указанном вами месте». Ваше имя файла или путь к нему неверны. Укажите структуру вашего пакета или, по крайней мере, путь к файлу класса, который включает метод load(String pFileName, Stage pStage, String pTitle), и путь к файлу FXML, который вы хотите загрузить. Прочтите javadoc API getResource() и изучите примеры кода об этом в сети.

person Uluk Biy    schedule 10.12.2012
comment
В конце концов я нашел правильную структуру для своих папок ресурсов и заставил ее работать. Спасибо. - person Samuel; 20.12.2012
comment
@Samuel, было бы неплохо рассказать, как вы на самом деле решили эту проблему. - person diegoaguilar; 29.10.2013
comment
@diegoaguilar, я бы хотел опубликовать, как я это решил. Но с тех пор проект был уничтожен ccleaner, так что у меня его больше нет. - person Samuel; 28.12.2013

Это проблема пути, Java должна знать, где взять файл из иерархии пакетов. Таким образом, использование "/package1/resourcename.fxml" должно найти источник в корне дерева. Обычно вы оставляете "/" в начале, так как вы уже находитесь наверху дерева пакетов.

person user176495    schedule 27.12.2013

У меня была такая же проблема. Заглянул внутрь моей Jar (с Winzip) и увидел, что файла FXML там нет. Оказывается, мой сценарий ANT, создающий файлы jar, включал только файлы * .class из каталога bin моего проекта.

person Almaniac    schedule 20.04.2015