Подтвердить что ты не робот

JavaFX "Требуется место". даже если он находится в одном пакете

Я пытаюсь запустить программу 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?

4b9b3361

Ответ 1

Работа с файлом в директории main/resources.

Ответ 2

В моем случае все вышеперечисленное не было проблемой вообще.

Моя проблема была решена при замене:

getClass().getResource("ui_layout.fxml")

с:

getClass().getClassLoader().getResource("ui_layout.fxml")

Ответ 3

URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURI().toURL();
Parent root = FXMLLoader.load(url);

Это помогло мне, потому что

getClass.getResource("path")

всегда возвращает меня ноль;

Ответ 4

Я видел эту ошибку несколько раз. Настолько часто, что я написал небольшой проект под названием "Простой" с шаблоном приложения 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, поэтому ресурсы будут относиться к папке ресурсов, следовательно:

  • "/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/person/target/person-00.00.01-SNAPSHOT.jar/fxml/tableWithDetails.fxml: 13

Будет означать, что существует проблема с Линией 13, в файле, за:

  • tableWithDetails.fxml : 13

В сообщении. На этом этапе вам нужно прочитать FXML и посмотреть, сможете ли вы выявить проблему. Вы можете попробовать несколько советов в соответствующем вопросе.

По этой причине я считаю, что имя файла было правильным: "Main.fxml". Когда файл был перемещен, имя, вероятно, было изменено или строка была переименована. Удачи.

по теме:

Ответ 5

вместо

Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));

ставить

Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));

Разница имеет значение "/".

Причина:

1-й: getResource попытается найти ресурс относительно пакета

2nd one: getResource будет рассматривать его как абсолютный путь и просто вызывать загрузчик классов.

Ответ 6

Эта проблема может быть вызвана неправильным путем к файлу FXML.

Если вы используете абсолютные пути (my/package/views/view.fxml), перед вами следует косая черта:

getClass().getResource("/my/package/views/view.fxml")

Вы также можете использовать относительные пути:

getClass().getResource("views/view.fxml")

Ответ 7

Я не мог использовать

getClass().getResource("views/view.fxml")

потому что я поместил свой класс контроллера в пакет "контроллеры", поэтому вот мое решение:

getClass().getResource("../views/view.fxml")

Ответ 8

Если вы посмотрите на документы [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

Ответ 9

Я получал ту же ошибку. В моем случае в имени файла fxml появился ведущий символ пространства:

"fxml_example.fxml" вместо "fxml_example.fxml"

Я не знаю, откуда она взялась. Это было очень трудно заметить. Когда я удалил ведущее пространство, все прошло нормально. Я даже не знал, что имя файла может начинаться с символа пробела.

Ответ 10

Если ваша проблема не связана с Maven, и вы получаете ту же NullPointerException, которая запускает это в браузере (при правильной работе с IDE), попробуйте следующее:

- > Netbeans → Проект правой кнопки мыши → Свойства → Сборка → Развертывание → Проверка "Запросить неограниченный доступ (Включить подписи, самозаверяющими)"

Это связано с аннотацией @FXML, требующей разрешения на ввод значение из разметки FXML (см. http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm)

Я запускал свое приложение на JDK8u31, и он никогда не будет работать без сертификата в Chrome/Firefox/IE.

Ответ 12

Я обнаружил, что все вышеперечисленные решения работают нормально, потому что они запускают вашу IDE для перестройки проекта. Никакой магии.

"Реальное" решение этой проблемы заключается в том, что вы должны просто отказаться от своего предыдущего каталога сборки.

  • Если вы используете Maven, просто удалите целевую папку (или выполните очистку mvn)!
  • Если вы используете ANT, удалите соответствующую папку (я думаю, что она вызвана)!
  • Если вы используете Gradle, удалите папку сборки!

Ответ 13

Я попробовал вышеуказанные ответы, и это не сработало в моем проекте. мой проект был с maven и openjfx в окнах. это решило проблему:

fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()

Ответ 14

Если ваш проект основан на Maven, Idea будет игнорировать все, кроме java файлов, в вашей папке src/main/java. Как вы сказали, перемещение файла в src/main/resources работает, но теперь SceneBuilder больше не знает о вашем классе контроллера, потому что он находится в совершенно другом каталоге, и вы теряете все понимание, вы строите вслепую.

Я считаю, что это проблема в intellij, поскольку SceneBuilder EXPECTS находит ваш Java файл класса контроллера в (и цитирую) "тот же каталог, прямой подкаталог или родительский каталог документа .fxml".

Ответ 15

У меня иногда было такое же Исключение.

Когда я создаю FXML файл с помощью Wizard в Eclipse, я пишу example.fxml в поле имени. Eclipse создает файл, например example.fxml.fxml. С этой ошибкой FXMLLoader не может найти правильный FXML файл. Итак, мой совет, проверьте имя файла FXML-Filename в вашем методе start-Method и реальном имени файла.

Надеюсь, что смогу помочь. Удачи.

Ответ 16

Я просто передал загрузчику правильный URL-адрес, например:

URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);