我试图让我的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文件,以防它出现名称问题。请帮忙。仅供参考,我在OSX上使用Intellij IDEA。
更新:这是一个Maven问题。我为这个项目设置了Maven并导致了这个问题。我暂时删除了Maven,所以我可以继续工作而不用它。有没有人知道如何在使用Maven时最好地处理这个问题?
答案 0 :(得分:64)
在我的情况下,以上所有都不是问题。
我替换后问题解决了:
getClass().getResource("ui_layout.fxml")
with:
getClass().getClassLoader().getResource("ui_layout.fxml")
答案 1 :(得分:37)
将文件移动到main / resources目录。
答案 2 :(得分:20)
$.noConflict();
jQuery( document ).ready(function( $ ) {
c = $(this.trigger)
});
这对我有帮助,因为
URL url = new File("src/main/java/ua/adeptius/goit/sample.fxml").toURL();
Parent root = FXMLLoader.load(url);
总是将我归还null;
答案 3 :(得分:19)
我现在已经看过几次这个错误了。我经常写一个小项目,名为&#34; Simple&#34;使用Netbeans Maven FXML应用程序模板只是为了回归作为一种参考模型&#39;当事情变得歪斜。为了测试,我使用这样的东西:
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项目,因此资源将相对于资源文件夹,因此:
传递给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.
如果你过了那个&#34;需要位置&#34;问题,那么你可能在FXML中遇到问题
//像这样: // javafx.fxml.LoadException: 文件:/ d:/sandbox/javafx/app_examples/person/target/person-00.00.01-SNAPSHOT.jar /fxml/tableWithDetails.fxml:13
意味着文件中的第13行出现了问题:
在邮件中。此时您需要阅读FXML并查看是否可以发现问题。您可以尝试相关问题中的一些提示。
对于这个问题,我的意见是文件名是正确的情况:&#34; Main.fxml&#34;。移动文件时,名称可能已更改或字符串已重新输入。祝你好运。
相关:
答案 4 :(得分:10)
而不是
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
把
Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));
差异是&#34; /&#34;
原因:
第一个:getResource将尝试查找相对于包的资源
第二个:getResource将它视为绝对路径,只需调用类加载器。
答案 5 :(得分:3)
此问题可能是由错误的FXML文件路径引起的。
如果您使用绝对路径(my/package/views/view.fxml
),则必须先使用斜杠:
getClass().getResource("/my/package/views/view.fxml")
您也可以使用相对路径:
getClass().getResource("views/view.fxml")
答案 6 :(得分:3)
我无法使用
getClass().getResource("views/view.fxml")
因为我将我的控制器类放入“controllers”包中,所以这是我的解决方案:
getClass().getResource("../views/view.fxml")
答案 7 :(得分:2)
我得到了同样的错误。在我的例子中,fxml文件名中有一个前导空格符号:
“fxml_example.fxml”而不是“fxml_example.fxml”
我不知道它来自哪里。很难注意到它。当我移除领先空间时,一切都很顺利。我甚至不知道文件名可以以空格符号开头。
答案 8 :(得分:2)
如果您的问题与Maven无关,并且您在浏览器中运行此问题时遇到相同的NullPointerException(从IDE运行它很好),请尝试以下操作:
- &GT; Netbeans - &gt;右键单击项目 - &gt;属性 - &gt;构建 - &gt;部署 - &gt;检查&#34;请求不受限制的访问权限(启用签名, 自签名)&#34;
这是因为@FXML Annotation需要注入权限 来自FXML标记的价值(见 http://docs.oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm)
我在JDK8u31上运行我的应用程序,如果没有Chrome / Firefox / IE中的证书,它将无法运行。
答案 9 :(得分:2)
如果查看文档[1],您会发现load()
方法可以使用网址:
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
答案 10 :(得分:1)
加载程序的根目录位于maven项目的“resources”文件夹中。因此,如果您有src/main/resources
,那么fxml文件路径应该从以下开始:
class User < ApplicationRecord
has_many :users_eds, dependent: :destroy
has_many :educations, through: :users_eds, dependent: :destroy
class Education < ApplicationRecord
has_many :users_eds, dependent: :destroy
has_many :users, through: :users_eds
class UsersEd < ApplicationRecord
belongs_to :user
belongs_to :education
https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
答案 11 :(得分:0)
2021 年 6 月:
将项目转换为 Maven 后,您应该将 fxml 和 css 文件移动到资源文件夹。只需拖放(在 IntelliJ 社区中)。然后:
Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getClassLoader().getResource("FXMLDocument.fxml")));
和:
root.getStylesheets().add(getClass().getResource("/newCascadeStyleSheet.css").toString());
样式表需要斜线。
仅此而已。
答案 12 :(得分:0)
您应在根目录中使用getClassLoader()
方法
Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("main.fxml"));
答案 13 :(得分:0)
我尝试了以上答案,但在我的项目中不起作用。我的项目是在Windows中使用maven
和openjfx
。
这解决了问题:
fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()
答案 14 :(得分:0)
我发现上述所有解决方案都可以正常工作,因为它们会触发您的IDE来重建项目。不涉及魔术。
此问题的“实际”解决方案是您应该放弃先前的构建目录。
答案 15 :(得分:0)
我只是简单地向加载程序传递了这样的URL:
URL url = getClass().getResource("myForm.fxml");
Parent root = FXMLLoader.load(url);
答案 16 :(得分:0)
我有时会遇到同样的异常。
当我在Eclipse中使用向导创建FXML文件时,我在名称字段中编写 example.fxml 。 Eclipse创建一个文件,如 example.fxml.fxml 。有了这个错误,FXMLLoader找不到合适的FXML文件。 所以,我的提示,检查start-Method中FXML-Filename的名称和文件的真实名称。
希望我能提供帮助。祝你好运。
答案 17 :(得分:0)
如果您的项目是基于Maven的,则会忽略src / main / java文件夹中除java文件之外的所有文件。就像你说把文件移动到src / main / resources一样,但现在SceneBuilder不再知道你的控制器类,因为它在一个完全不同的目录中,你失去了所有的洞察力,你盲目地构建。
我相信这是intellij中的一个问题,因为SceneBuilder EXPECTS 找到你的控制器类java文件(并且我引用)“同一目录,直接子目录或.fxml的父目录“文件。