javafx库在java文件的位置_java-JavaFX“需要位置。” 即使在同一包装中

本文档描述了在JavaFX程序中遇到'java.lang.NullPointerException:必须提供位置'错误的问题。问题出在尝试加载FXML文件时。解决方案包括使用getClass().getClassLoader().getResource()方法,移动FXML文件到'main/resources'目录,检查文件路径是否以正斜杠开头,检查文件名是否有前导空格,以及确保在Maven项目中正确配置资源路径。
摘要由CSDN通过智能技术生成

java-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文件的副本:

xmlns="http://javafx.com/javafx/2.2"

fx:controller="com.kromalights.designer.entry.Controller">

控制器类确实存在,并且位于fxml文件中指定的包中。 我所有的名字都是正确的,也是我认为应该的位置。 我想念什么? 我确实尝试重命名我的fxml文件,以防这是一个名称问题。 请帮忙。 仅供参考,我在OSX上使用Intellij IDEA。

更新:这是一个Maven问题。 我为此项目设置了Maven,这引起了问题。 我暂时删除了Maven,因此没有它我可以继续工作。 有没有人对我在使用Maven时如何最好地解决这一问题有任何见解?

Gremash asked 2020-08-02T17:14:39Z

16个解决方案

71 votes

就我而言,以上所有都不是问题。

我更换时解决了我的问题:

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

与:

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

Amir Arad answered 2020-08-02T17:14:59Z

40 votes

将该文件移到main / resources目录有效。

Gremash answered 2020-08-02T17:15:19Z

22 votes

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

Parent root = FXMLLoader.load(url);

这对我有帮助,因为

getClass.getResource("path")

总是返回null;

Adeptius answered 2020-08-02T17:15:43Z

19 votes

我已经几次看到此错误。 我经常写一个带有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文件夹,因此:

"/分享美丽/卖弄.分享美丽".

前导斜杠是必需的。

传递给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”。 移动文件时,名称可能已更改或重新键入了字符串。 祝好运。

有关:

寻求FXML / FXMLLoader错误诊断工具

will answered 2020-08-02T17:17:01Z

10 votes

代替

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

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

差异为“ /”。

原因:

第一个:getResource将尝试查找相对于包的资源

第二个:getResource会将其视为绝对路径,只需调用类加载器。

minigeek answered 2020-08-02T17:17:43Z

3 votes

FXML文件的路径错误可能导致此问题。

如果您使用的是绝对路径(my/package/views/view.fxml),则必须在其之前加上斜杠:

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

您也可以使用相对路径:

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

gronostaj answered 2020-08-02T17:18:11Z

3 votes

我不能用

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

因为我将控制器类放入“ controllers”包中,所以这是我的解决方案:

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

alexkov answered 2020-08-02T17:18:36Z

3 votes

如果您看一下文档[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/Java色/8/Java方向/API/Java方向/分享美丽/F XML loader.htm]

james.garriss answered 2020-08-02T17:19:09Z

2 votes

我遇到了同样的错误。 在我的情况下,fxml文件名中有一个前导空格符号:

“ fxml_example.fxml”代替“ fxml_example.fxml”

我不知道它从哪里来。 很难注意到它。 当我删除领先空间时,一切正常。 我什至不知道文件名可以以空格符号开头。

Evaldas Ilginis answered 2020-08-02T17:19:39Z

2 votes

如果您的问题与Maven不相关,并且您在浏览器中运行此错误时得到了相同的NullPointerException(从IDE运行它就可以了),请尝试以下操作:

-> Netbeans->右键单击项目->属性->构建->部署->选中“请求不受限制的访问(启用签名, 自签名)”

这是由于@FXML注释需要注入权限 FXML标记中的值(请参阅 [http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm])

我在JDK8u31上运行我的应用程序,没有Chrome / Firefox / IE中的证书,它将无法运行。

mroesler answered 2020-08-02T17:20:13Z

1 votes

装载程序的根目录位于Maven项目的'resources'文件夹中。 因此,如果您有src/main/java,则fxml文件路径应从以下位置开始:src/main/resources

[HTTPS://maven.Apache.org/guides/Introduction/Introduction-to-他和-standard-directory-layout.HTML]

Thomas Bratt answered 2020-08-02T17:20:37Z

1 votes

我发现上述所有解决方案都可以正常工作,因为它们会触发您的IDE来重建项目。 不涉及魔术。

解决此问题的“实际”方法是您应该放弃先前的构建目录。

如果您使用的是Maven,只需删除目标文件夹(或执行mvn clean)!

如果您使用的是ANT,请删除相应的文件夹(我认为它已被删除)!

如果您使用的是Gradle,请删除构建文件夹!

John Smith answered 2020-08-02T17:21:15Z

1 votes

我尝试了以上答案,但在我的项目中不起作用。 我的项目是在Windows中使用maven和openjfx。

这解决了问题:

FXMLLoader fxmlLoader = new FXMLLoader();

fxmlLoader.setLocation(getClass().getResource("/main.fxml"));

root = fxmlLoader.load()

gigili answered 2020-08-02T17:21:39Z

0 votes

如果您的项目是基于Maven的,Idea将忽略src / main / java文件夹中的除Java文件之外的所有文件。 就像您说的将文件移动到src / main / resources一样,但是现在SceneBuilder不再知道您的控制器类,因为它位于完全不同的目录中,并且您失去了所有洞察力,盲目地进行了构建。

我相信这是intellij中的一个问题,因为SceneBuilder EXPECTS可以在“相同目录,.fxml的直接子目录或父目录”文档中找到您的控制器类java文件。

Pedro Borges answered 2020-08-02T17:22:05Z

0 votes

有时我也有同样的例外。

当我使用Eclipse中的向导创建FXML文件时,我在名称字段中编写example.fxml。 Eclipse创建一个文件,例如example.fxml.fxml。 遇到此错误,FXMLLoader找不到正确的FXML文件。因此,我的技巧是,在启动方法中检查FXML文件名的名称以及文件的真实名称。

希望我能帮上忙。 祝好运。

budo answered 2020-08-02T17:22:34Z

-1 votes

我只是向加载程序传递了一个适当的URL,如下所示:

URL url = getClass().getResource("myForm.fxml");

Parent root = FXMLLoader.load(url);

Michael Sims answered 2020-08-02T17:22:53Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值