Изменение пути к файлам javafx в java

Изменение пути к файлам javafx в java

У меня есть проект 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

Кто-нибудь знает, что с этим не так?

Как вы запускаете свое приложение?

tmarwen 18.06.2018 18:34

Запуск от имени / Java-приложение

andreas Viena 18.06.2018 18:45

Сделайте снимок экрана со структурой каталогов в вашей среде IDE и добавьте свой вопрос, так как мне нужно понять, что вы имеете в виду под projectFolder и почему вы получили двойную косую черту при использовании вспомогательного метода!

Yahya 18.06.2018 22:34

Я загрузил структуру папок. Двойная косая черта - это опечатка, и stackoverflow не позволяет мне ее редактировать.

andreas Viena 19.06.2018 01:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
1 200
2

Ответы 2

Я не рекомендую эту запутанную файловую структуру ...

Но в этом случае я считаю, что вам нужно будет использовать относительный путь к ресурсу: ../application/Main.fxml

getClass().getResource() ожидает, что ресурс находится в том же каталоге, что и вызывающий класс. Это не так, поэтому вам понадобится Java для резервного копирования одного каталога с помощью ...

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

JKostikiadis 18.06.2018 19:20

какую структуру вы рекомендуете? Если я сделаю что-нибудь вроде FXMLLoader.load (getClass (). GetResource ("../ application / Main.‌ fxml")); Я получаю ошибку другого типа: java.lang.NullPointerException: требуется местоположение.

andreas Viena 18.06.2018 19:33

Предполагая, что у нас с вами действительно такая же структура проекта, как на картинке ниже:

Чтобы загрузить файл 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 и попытаетесь его выполнить, вы получите ту же ошибку, что и с самого начала. Вы можете прочитать об этом в аналогичном посте вроде этого: Он работает нормально в Eclipse, но не может работать как файл .jar

Обновлено: для проекта maven вам следует подумать о перемещении файла FXML в папку src / main / resources /. Вы можете найти еще один в этом посте: JavaFX и maven: NullPointerException: требуется расположение

Спасибо, но у меня он точно такой же, как этот загрузчик FXMLLoader = новый FXMLLoader (this.getClass (). GetResource ("/ main / java / com / appli cation / Main.fxml")); и по-прежнему получаю эту ошибку [Тема приложения JavaFX] ОШИБКА com.application.Main - java.lang.NullPointerException: требуется местоположение.

andreas Viena 18.06.2018 20:01

@andreasViena Интересно .. В этом случае есть две возможности: либо это Java-проект Maven / Gradle, который по-разному обрабатывает пути и имеет другую структуру проекта, либо у вас нет такой же структуры проекта, как у меня, показывая нам изображение вашего обзора навигатора на затмении может быть полезным

JKostikiadis 18.06.2018 20:05

да, у меня такая же структура. Я собираюсь проверить дело maven

andreas Viena 18.06.2018 20:11

@AndreasViena Когда вы создаете проект, вы выбираете опцию «Java Project», верно? Какую среду IDE вы используете (Eclipse, InteliJ и т. д.)? Какая у вас версия Java? Может проблема в другом.

JKostikiadis 18.06.2018 20:14

Это проект знатока. Я использую Eclipse, java 8

andreas Viena 18.06.2018 20:21

@andreasViena Ну, я не знаком с Maven, но из того, что я могу сказать, вам нужно сделать некоторые конфигурации или использовать определенную структуру папок для загрузки ресурсов. Взгляните на похожий пост вроде этого: stackoverflow.com/questions/20348657/…

JKostikiadis 18.06.2018 20:23

Интересно. Странно то, что если я назову свое пакетное приложение instade com.application и сделаю это Parent root = FXMLLoader.load (getClass (). GetResource ("/ application / Main.fx‌ ml")); он отлично работает

andreas Viena 18.06.2018 20:45

@andreasViena Может быть, есть какое-то отношение к тому, как maven манипулирует файлами при компиляции. Подумайте о том, чтобы проверить правку в моем сообщении, чтобы узнать, узнаете ли вы о своей проблеме. Также рассмотрите возможность добавления информации, которую вы предоставляете в комментариях выше, в основной пост, чтобы все могли их видеть (я имею в виду Maven и т. д.), Также вы можете добавить соответствующий тег maven.

JKostikiadis 18.06.2018 21:08

Другие вопросы по теме