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