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")

перемещение файла в каталог main/resources работало.


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);