FXMLLoader не найдет файл fxml - проект Maven - PullRequest
0 голосов
/ 11 апреля 2019

Когда я запускаю основной класс в проекте Maven, я получаю:

Исключение в методе запуска приложения

Из того, что я понял, этопотому что файл FXML не загружается.

Это иерархия файловой системы

 src
    └- main
        ├- java
        |   └- zenit
        |      └- ui
        |         └- TestUI.java
        └- resources
            └- zenit
               └- ui
                  └- Main.fxml

В Eclipse (внутри src)

enter image description here

enter image description here

Чтение Руководство Apache Maven и Другие вопросы Statck , следующий код-snippet, кажется, является правильным способом создания FXMLLoader и указания на файл Main.fxml.

public class TestUI extends Application {
    public void start(Stage stage) throws IOException {

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

        .
        .   // set controller, load parent, set scene etc.
        .

    }

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

Но этот код вызовет ранее указанное исключение.

Когда япопытался определить, откуда в моем коде появился Exception, я понял, что это форма FXMLLoader.Поэтому я запустил разные sysouts (по одному за раз) в строке выше FXMLLoader loader = new FXMLLoader(..):

    System.out.println(getClass().getResource("Main.fxml"));
    System.out.println(getClass().getResource("main/resources/zenit/ui/Main.fxml"));
    System.out.println(getClass().getResource("../../../resources/zenit/ui/Main.fxml"));

Для всех вывод консоли был: (очевидно, не ожидаемый вывод)

null

Итак, мой вопрос:

Почему .getResource("Main.fxml") возвращает null здесь?

Как правильно получить доступ к Main.fxml файл в этом случае?

Моя система:

  • Maven: Apache Maven 3.6.0
  • Java SE: 11.0.2
  • JavaFX: 11.0.2
  • Затмение: 2018-12 (4.10.0)
  • ОС: macOS Mojave - v10.14.3

1 Ответ

1 голос
/ 12 апреля 2019
  1. Думаю, вашей главной проблемой является библиотека "Иконли".Если вы попытаетесь открыть fxml с помощью scenebuilder, вы увидите исключение.Я рекомендую, чтобы вы потеряли эту зависимость.Используйте что-нибудь попроще, например svg graphics:

    • В кнопке fxml> добавьте регион> задайте размер региона> затем в разделе стиля добавьте свойство css -fx-shape> и взначение задает путь svg в кавычках, т. е .: «M827.6 ... 122z»

    • Затем добавьте еще одно свойство css -fx-scale-shape> и установите для его значения значение true

Выше не требуется никаких сторонних библиотек, и вы можете найти все значки бесплатно онлайн.

Я рекомендую вам загрузить ваш fxml из класса основного контроллера.В fxml проверьте свойство fxroot и добавьте конструктор к вашему главному контроллеру следующим образом:

public MainController () {

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
    loader.setController(this);
    loader.setRoot(this);
    loader.load();

} catch (IOException e) {
    e.printStackTrace();
}

}

Ваш контроллер должен расширять корневой контейнер следующим образом:

открытый класс MainController расширяет VBox {

, тогда в основном классе просто передайте главный контроллерна сцену

Scene scene = new Scene(controller);

Я считаю, что ваш проект Maven был настроен неправильно.Вы должны щелкнуть правой кнопкой мыши на вашем проекте> настроить> преобразовать в Maven проекта.Затем почистите пакеты, если они покраснеют.

Последнее - вам нужно добавить еще один класс с именем Launcher - и затем вы запускаете из него свое приложение - не удаляйте метод main из вашего основного класса

пакет zenit.ui;

пусковая установка открытого класса {

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

}

Надеюсь, это поможет!

...