Веб-развертывание JavaFX: FXMLLoader NullPointerException

Я хотел опробовать развертывание веб-браузера JavaFX, поэтому я начал очень простой тестовый проект, используя шаблон JavaFX Application версии 14.0.2 сообщества IntelliJ. Вот код: (плагин NO, внешняя библиотека или maven)

Main.java

@Override
public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Hello World");
    primaryStage.setScene(new Scene(root, 300, 275));
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}

Controller.java (прикреплен к sample.fxml)

@FXML
private TextField textField;

@FXML
private Label label;

@FXML
private void setLabelText() {
    label.setText(textField.getText());
}

sample.fxml (файл макета)

<VBox alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
      prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/8"
      xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0"/>
   </padding>
   <TextField fx:id="textField" onAction="#setLabelText"/>
   <Label fx:id="label" text="Label">
      <font>
         <Font size="96.0"/>
      </font>
   </Label>
</VBox>

Теперь, когда я создаю приложение как JAR, оно запускается без проблем. Однако, когда я создаю его с использованием предварительно определенного артефакта «JavaFXApp», он генерирует один HTML, один jnlp и один jar. Когда я открываю HTML-код в своем браузере (Firefox Nightly 64bit), я получаю следующую ошибку:

java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at sample.Main.start(Main.java:13)
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/1838209255.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$44/1604839423.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/982109627.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException: Location is required.
    at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/1838209255.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$44/1604839423.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/982109627.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
    at javafx.fxml.FXMLLoader.load(Unknown Source)
    at sample.Main.start(Main.java:13)
    ... 11 more

Соответствующая строка кода кажется

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

Однако эта же строка кода отлично работает, когда создается и открывается как отдельный автономный JAR! Есть идеи, почему возникает ошибка или как ее исправить?


person suushiemaniac    schedule 23.12.2014    source источник


Ответы (1)


Ошибка несколько загадочная, но понятная. вы получаете нулевой указатель с локализованным сообщением «Требуется местоположение», которое означает, что вы не указали местоположение для поиска FXML.

getClass (). getResource ("sample.fxml") возвращает null, и поэтому FXMLLoader выдает нулевой указатель. Проверьте путь к вашему fxml, возможно, вы захотите добавить к нему '/', например, "/sample.fxml".

person Terraego    schedule 24.02.2015
comment
Это не устранило проблему :( Как я сказал в исходном сообщении, автономный JAR работает нормально, даже без добавления /. Это просто артефакт JavaFX, который вызывает ошибку ... - person suushiemaniac; 22.04.2015
comment
Тогда это похоже на проблему пути к классам, вы можете проверить содержимое jar и посмотреть, есть ли в нем sample.fxml? - person Terraego; 22.04.2015