Когда я запускаю основной класс в проекте Maven, я получаю:
Exception in Application start method
Насколько я понял, это потому, что файл FXML не загружается.
Это иерархия файловой системы
src
└- main
├- java
| └- zenit
| └- ui
| └- TestUI.java
└- resources
└- zenit
└- ui
└- Main.fxml
В Eclipse (внутри src)
Читая руководство апача по maven и другие вопросы по статистике, следующий фрагмент кода кажется правильным способом создания 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 в этом случае?Моя система:
Я обновил свой вопрос. То же самое.. :(
package zenit.ui; ... class TestUI {}. В eclipse исходные каталоги должны быть java и ресурсами для соответствия maven. Загляните в банку за файлом /zenit/ui/Main.fxml@Strazan попробуй поставить "../../../rescources/zenit/ui/Main.fxml" и увидишь?
@JoopEggen У меня есть java, а ресурсов нет? Должен ли я удалить src и иметь только их? Я нашел Main.fxml-файл в банке"
@DiliniPeiris то же самое :/
@ Стразан, может быть, я говорю глупость .. но неправильное написание слова «ресурсы». и вы, и я ранее написали «ресурсы». исправить это и посмотреть? потому что у меня когда-то была эта проблема давным-давно, и это был вопрос правильного написания имен пакетов
@DiliniPeiris, ха-ха, Иисус Христос: P, к сожалению, все еще null
У вас могут быть другие проблемы — обычно, когда он не может найти fxml — в исключении будет указано «местоположение не установлено».
Для maven у вас правильная иерархия. Если вы откроете банку с помощью 7zip или чего-то еще, вы должны увидеть /zenit/ui/Main.fxml. На самом деле вы также можете использовать абсолютный путь getResource("/zenit/ui/Main.fxml"). (Возможно, только что каким-то образом сборка проекта maven неправильно настроена в eclipse.) Проверьте jar
@JoopEggen Я вижу Main.fxml внутри банки под zenit/ui/ !! и когда я использую getResource("/zenit/ui/Main.fxml") sysout напечатает путь, а не null!! ваше здоровье! но я все еще получаю исключение: /
@EdvBeq есть идеи, в чем может быть проблема? :D
Если выложишь куда-нибудь свой проект - вечером могу глянуть.
@EdvBeq Спасибо, это очень мило с вашей стороны! Вот проект ( feature/maven2 - это ветка. Я пытаюсь преобразовать проект в maven.) github.com/strazan/zenit/tree/feature/maven2
Очевидно, что Main.fxml найден (URL-адрес не нулевой). Таким образом, исключение (которое вы не указали) должно указывать на какую-то (следующую) проблему. Начните с простого fxml.
@JoopEggen хорошо, у меня нет трассировки стека. Я написал все, что я получил!! Я попробовал с новым fxml сейчас (pane, завернутый в anchorpane), то же самое:/
Безнадежно, но попробуйте пример приложения Mave JavaFX.
@JoopEggen да!! ваше здоровье




Я думаю, что ваша главная проблема - это библиотека "ikonli". Если вы попытаетесь открыть fxml с помощью scenebuilder, вы увидите исключение. Я рекомендую вам избавиться от этой зависимости. Используйте что-нибудь попроще, например графику svg:
В кнопке fxml> добавить регион> установите размер региона> затем в разделе стилей добавьте свойство css -fx-shape> и в значении установите путь svg в кавычках, например: «M827.6 ... 122z»
Затем добавьте еще одно свойство css -fx-scale-shape > и установите для него значение true.
Вышеупомянутое не требует никаких сторонних библиотек, и вы можете найти все значки бесплатно в Интернете.
общественный главный контроллер () {
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 - и затем вы запускаете свое приложение из него - не удаляйте основной метод из вашего основного класса
пакет зенит.уи;
пусковая установка открытого класса {
public static void main(String[] args) {
TestUI.main(args);
}
}
Надеюсь это поможет!
ааа!!! спасибо, помогло удаление иконли! Странно, так как ikonli работал, когда проект был обычным java-проектом. Есть идеи, почему? но если я установлю root (это), я получу Root value already specified. что я должен/не должен иметь в fxml?
если я уберу VBox из fxml, я получу Invalid root element.
Я завернул код fxml в <fx:root> , и теперь у меня нет исключений, приложение работает, но ничего визуального не появляется :/
извините за спам, теперь работает!!! спасибо большое вы легенда! <3
попробуйте указать имена пакетов перед «Main.fxml» в методе getResourse(), потому что класс TestUI и файл fxml находятся в разных местах.