JavaFX " расположение требуется.- даже если он в том же пакете .
Я пытаюсь запустить свою программу JavaFX, но у меня возникли некоторые трудности. Я продолжаю получать ошибку " java.ленг.NullPointerException: требуется расположение.'Файл fxml находится в том же пакете, что и класс приложения. Вот мой очень простой код:
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);
}
}
и вот копия моего основного.файл 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 в случае, если это была проблема с именем. Пожалуйста помочь. К вашему сведению, я использую IntelliJ IDEA на OSX.
UPDATE: это проблема Maven. Я установил Maven для этого проекта, и это вызвало проблему. Я временно удалил Maven, чтобы продолжить работу без него. Кто-нибудь имеет представление о том, как я лучше всего справлюсь с этим при использовании Maven?
14 ответов
в моем случае все вышеперечисленное не проблема вообще.
моя проблема была решена, когда я заменил :
getClass().getResource("ui_layout.fxml")
С :
getClass().getClassLoader().getResource("ui_layout.fxml")
URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURL();
Parent root = FXMLLoader.load(url);
это помогло мне, потому что
getClass.getResource("path")
allways возвращает мне null;
Я видел эту ошибку несколько раз. Так часто, что я написал небольшой проект под названием "простой" с шаблоном приложения 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, поэтому ресурсы будут относительно папки resources, следовательно:
- " /fxml / main.FXML-файл".
- требуется ведущая косая черта.
-
ресурс, переданный в 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/человек/цель / человек-00.00.01-снимок.Джар!/FXML-файл/tableWithDetails.FXML-файл:13
будет означать, что есть проблема на строка 13, в файле, per:
- tableWithDetails.FXML-файл :13
в сообщении. На этом этапе вам нужно прочитать FXML и посмотреть, можете ли вы определить проблему. Ты мог бы ... попробуйте некоторые советы в соответствующем вопросе.
для этой проблемы я считаю, что имя файла было правильным: "Main.FXML-файл". Когда файл был перемещен, имя, вероятно, было изменено или строка была перепечатана. Удача.
по теме:
вместо
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
поставить
Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));
разница в " / " .
причина :
1st one: getResource попытается найти ресурс относительно пакета
2nd one: getResource будет рассматривать его как абсолютный путь и просто вызывать classloader .
эта проблема может быть вызвана неправильным путем к файлу 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")
Я получал ту же ошибку. В моем случае в имени файла 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
Если ваш проект основан на Maven, идея будет игнорировать все, кроме java-файлов в папке src/main/java. Как вы сказали, перемещение файла в src/main / resources работает, но теперь SceneBuilder больше не знает о вашем классе контроллера, потому что он находится в совершенно другом каталоге, и вы теряете все понимание, вы строите вслепую.
Я считаю, что это проблема в intellij, так как SceneBuilder ждет чтобы найти файл java класса контроллера в (и я цитирую) "the тот же каталог, прямой подкаталог или родительский каталог.документ "fxml".
У меня иногда такое же исключение.
когда я создаю FXML-файл с мастером в Eclipse, я пишу пример.FXML-файл в поле "Имя". Eclipse создает файл, например пример.FXML-файл.FXML-файл. С этой ошибкой FXMLLoader не может найти правильный FXML-файл. Итак, мой совет, проверьте имя файла FXML в вашем start-методе и реальное имя файла.
надеется, что я смогу помочь. Удача.
Если вы посмотрите на документы [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 находится в папке resources.
[1] https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/FXMLLoader.htm
Я просто передал загрузчику правильный URL-адрес:
URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);