【问题标题】:FXML JavaFX app run through JNLP java.lang.NullPointerException: Location is requiredFXML JavaFX 应用程序通过 JNLP java.lang.NullPointerException 运行:需要位置
【发布时间】:2016-09-25 21:29:39
【问题描述】:

交叉张贴: • https://community.oracle.com/message/13857396#13857396http://www.coderanch.com/t/666195/JavaFX/java/FXML-JavaFX-app-run-JNLP#3105294

我尝试将 JavaFX FXML 应用程序部署为 Web Start,但出现以下异常。 Jar 可以正常工作,也可以作为独立应用程序部署。我在 NetBeans v. 8.0.2 中构建了项目。我在互联网上发现了很多类似的线程,但要么解决方案有效,要么我认为解决方案是正确的。

在所有解决方案中都已经确定了这一行

SomeClass root = FXMLLoader.load(getClass().getResource("someFXML.fxml"));

作为一个原因。

解决方案是:

  1. 使用路径 /someFXML.fxml。
  2. 使用 FXMLLoader.load(getClass().getClassLoader().getResource("someFXML.fxml"));
  3. 使用 FXMLLoader.load(getClass().getClassLoader().getResource("packageName/someFXML.fxml"));
  4. 检查文件是否存在。
  5. 在罐子上签名。

我可能都试过了。

我认为解决方案不取决于显示的行。

例外

java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at xy.XY.start(XY.java:36)
at com.sun.javafx.applet.FXApplet2$2.run(FXApplet2.java:134)
at com.sun.javafx.application.PlatformImpl.lambda$null$173    (PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
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(FXApplet2.java:150)
at com.sun.javafx.application.PlatformImpl.lambda$null$173    (PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at xy.XY.start(XY.java:36)
at com.sun.javafx.applet.FXApplet2$2.run(FXApplet2.java:134)
... 7 more

主类

package testfxmlpackage;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TestFXMLPackage extends Application {

  @Override
  public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
  }
  public static void main(String[] args) {
    launch(args);
  }  
}

控制器

package testfxmlpackage;

import javafx.fxml.FXML;
import javafx.scene.text.TextFlow;

public class FXMLDocumentController {

   @FXML TextFlow xy;

}

FXML

<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.TextFlow?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testfxmlpackage.FXMLDocumentController">
    <children>
        <TextFlow fx:id="xy" layoutX="22.0" layoutY="234.0" prefHeight="74.0" prefWidth="433.0" style="-fx-border-color: ADD8E6;" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="22.0" AnchorPane.rightAnchor="142.0" />               
    </children>
</AnchorPane>

【问题讨论】:

  • 在您的问题中包含jar xvf &lt;yourjarfile.jar&gt; 的输出。它是否显示testfxmlpackage/FXMLDocument.fxml 存在?您可能还对using JavaFX in a browser 上的一些想法感兴趣。您的堆栈跟踪也有:at xy.XY.start(XY.java:36)。您确定这是您提供的代码的堆栈跟踪吗? (你没有在 xy 包中提供 XY 类,所以有点奇怪)。
  • 我也有同样的问题,请问有解决办法吗?

标签: javafx java-web-start jnlp fxmlloader


【解决方案1】:

我还没有尝试过,但是查看 source code 我认为活动的 SecurityManager 可能是问题的原因。

可能的解决方案:

  • 设置 FXMLLoader 的 location 属性。请注意,我为 FXMLLoader 编写了一些实用方法,这些方法设置了开箱即用的 location 属性:FXMLLoaders

该库是开源的,可以与以下依赖项一起使用:

<dependency>
    <groupId>org.drombler.commons</groupId>
    <artifactId>drombler-commons-fx-core</artifactId>
    <version>0.7</version>
</dependency>

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多