Ответ 1
Работа с файлом в директории main/resources.
Я пытаюсь запустить программу JavaFX, но у меня есть некоторые трудности. Я продолжаю получать сообщение об ошибке "java.lang.NullPointerException: требуется место". Файл fxml находится в том же пакете, что и класс Application. Вот мой очень простой код:
package com.kromalights.designer.entry;
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 {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
primaryStage.setTitle("Kromalights Designer");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
И вот копия моего файла main.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>
<?scenebuilder-stylesheet mailStyles.css?>
<?import java.net.*?>
<BorderPane prefHeight="300.0" prefWidth="300.0" xmlns:fx="http://javafx.com/fxml/1"
xmlns="http://javafx.com/javafx/2.2"
fx:controller="com.kromalights.designer.entry.Controller">
<bottom>
<Pane prefHeight="200.0" prefWidth="200.0"/>
</bottom>
<center>
<Pane prefHeight="200.0" prefWidth="200.0"/>
</center>
<left>
<VBox prefHeight="200.0" prefWidth="100.0"/>
</left>
<top>
<HBox prefHeight="100.0" prefWidth="200.0"/>
</top>
<stylesheets>
<URL value="@mainStyles.css" />
</stylesheets>
</BorderPane>
Класс контроллера существует и находится в пакете, указанном в файле fxml. Все мои имена верны, и я думаю, что они должны быть. Что мне не хватает? Я попытался переименовать свой файл fxml на случай, если это проблема с именем. Пожалуйста помоги. FYI, я использую Intellij IDEA на OSX.
ОБНОВЛЕНИЕ: Это проблема Maven. Я настраиваю Maven для этого проекта, и это вызвало проблему. Я временно удалил Maven, чтобы продолжить работу без него. Кто-нибудь имеет представление о том, как лучше всего справиться с этим при использовании Maven?
Работа с файлом в директории main/resources.
В моем случае все вышеперечисленное не было проблемой вообще.
Моя проблема была решена при замене:
getClass().getResource("ui_layout.fxml")
с:
getClass().getClassLoader().getResource("ui_layout.fxml")
URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURI().toURL();
Parent root = FXMLLoader.load(url);
Это помогло мне, потому что
getClass.getResource("path")
всегда возвращает меня ноль;
Я видел эту ошибку несколько раз. Настолько часто, что я написал небольшой проект под названием "Простой" с шаблоном приложения Netbeans Maven FXML, чтобы вернуться к нему в качестве своего рода "эталонной модели", когда все идет косой. Для тестирования я использую что-то вроде этого:
String sceneFile = "/fxml/main.fxml";
Parent root = null;
URL url = null;
try
{
url = getClass().getResource( sceneFile );
root = FXMLLoader.load( url );
System.out.println( " fxmlResource = " + sceneFile );
}
catch ( Exception ex )
{
System.out.println( "Exception on FXMLLoader.load()" );
System.out.println( " * url: " + url );
System.out.println( " * " + ex );
System.out.println( " ----------------------------------------\n" );
throw ex;
}
При запуске этого фрагмента и сбое загрузки вы должны увидеть причину или, по крайней мере, сообщение от FXMLLoader. Поскольку это тест, я бросаю исключение. Вы не хотите продолжать.
Заметки. Это проект maven, поэтому ресурсы будут относиться к папке ресурсов, следовательно:
Ресурс, переданный FXMLLoader, чувствителен к регистру:
// If you load "main.fxml" and your file is called: "Main.fxml"
// You will will see the message ...
java.lang.NullPointerException: Location is required.
Если вам удастся решить проблему с "местоположением", у вас может возникнуть проблема в FXML
//Что-то вроде этого: // javafx.fxml.LoadException: Файл:/D:/sandbox/javafx/app_examples/person/target/person-00.00.01-SNAPSHOT.jar/fxml/tableWithDetails.fxml: 13
Будет означать, что существует проблема с Линией 13, в файле, за:
В сообщении. На этом этапе вам нужно прочитать FXML и посмотреть, сможете ли вы выявить проблему. Вы можете попробовать несколько советов в соответствующем вопросе.
По этой причине я считаю, что имя файла было правильным: "Main.fxml". Когда файл был перемещен, имя, вероятно, было изменено или строка была переименована. Удачи.
по теме:
вместо
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
ставить
Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));
Разница имеет значение "/".
Причина:
1-й: getResource попытается найти ресурс относительно пакета
2nd one: getResource будет рассматривать его как абсолютный путь и просто вызывать загрузчик классов.
Эта проблема может быть вызвана неправильным путем к файлу FXML.
Если вы используете абсолютные пути (my/package/views/view.fxml
), перед вами следует косая черта:
getClass().getResource("/my/package/views/view.fxml")
Вы также можете использовать относительные пути:
getClass().getResource("views/view.fxml")
Я не мог использовать
getClass().getResource("views/view.fxml")
потому что я поместил свой класс контроллера в пакет "контроллеры", поэтому вот мое решение:
getClass().getResource("../views/view.fxml")
Если вы посмотрите на документы [1], вы увидите, что метод load()
может принимать URL-адрес:
load(URL location)
Итак, если вы используете Java 7 или новее, вы можете загрузить файл FXML следующим образом:
URL url = Paths.get("./src/main/resources/fxml/Fxml.fxml").toUri().toURL();
Parent root = FXMLLoder.load(url);
Этот пример из проекта Maven, поэтому файл FXML находится в папке ресурсов.
[1] https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/FXMLLoader.htm
Я получал ту же ошибку. В моем случае в имени файла fxml появился ведущий символ пространства:
"fxml_example.fxml" вместо "fxml_example.fxml"
Я не знаю, откуда она взялась. Это было очень трудно заметить. Когда я удалил ведущее пространство, все прошло нормально. Я даже не знал, что имя файла может начинаться с символа пробела.
Если ваша проблема не связана с Maven, и вы получаете ту же NullPointerException, которая запускает это в браузере (при правильной работе с IDE), попробуйте следующее:
- > Netbeans → Проект правой кнопки мыши → Свойства → Сборка → Развертывание → Проверка "Запросить неограниченный доступ (Включить подписи, самозаверяющими)"
Это связано с аннотацией @FXML, требующей разрешения на ввод значение из разметки FXML (см. http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm)
Я запускал свое приложение на JDK8u31, и он никогда не будет работать без сертификата в Chrome/Firefox/IE.
Корневой каталог загрузчика находится в папке "Ресурсы" для проекта maven. Поэтому, если у вас есть src/main/java
, тогда путь файла fxml должен начинаться с:
src/main/resources
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
Я обнаружил, что все вышеперечисленные решения работают нормально, потому что они запускают вашу IDE для перестройки проекта. Никакой магии.
"Реальное" решение этой проблемы заключается в том, что вы должны просто отказаться от своего предыдущего каталога сборки.
Я попробовал вышеуказанные ответы, и это не сработало в моем проекте. мой проект был с maven
и openjfx
в окнах. это решило проблему:
fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()
Если ваш проект основан на Maven, Idea будет игнорировать все, кроме java файлов, в вашей папке src/main/java. Как вы сказали, перемещение файла в src/main/resources работает, но теперь SceneBuilder больше не знает о вашем классе контроллера, потому что он находится в совершенно другом каталоге, и вы теряете все понимание, вы строите вслепую.
Я считаю, что это проблема в intellij, поскольку SceneBuilder EXPECTS находит ваш Java файл класса контроллера в (и цитирую) "тот же каталог, прямой подкаталог или родительский каталог документа .fxml".
У меня иногда было такое же Исключение.
Когда я создаю FXML файл с помощью Wizard в Eclipse, я пишу example.fxml в поле имени. Eclipse создает файл, например example.fxml.fxml. С этой ошибкой FXMLLoader не может найти правильный FXML файл. Итак, мой совет, проверьте имя файла FXML-Filename в вашем методе start-Method и реальном имени файла.
Надеюсь, что смогу помочь. Удачи.
Я просто передал загрузчику правильный URL-адрес, например:
URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);