JavaFX“位置是必需的。”即使它在同一个包装中

时间:2013-12-10 23:33:02

标签: java javafx-2

我试图让我的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时最好地处理这个问题?

18 个答案:

答案 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项目,因此资源将相对于资源文件夹,因此:

  • &#34; /fxml/main.fxml"
  • 需要前导斜杠。
  • 传递给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行出现了问题:

  • tableWithDetails.fxml :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中使用mavenopenjfx。 这解决了问题:

fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()

答案 14 :(得分:0)

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

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

  • 如果您使用的是Maven,只需删除目标文件夹(或执行mvn clean)!
  • 如果您使用的是ANT,请删除相应的文件夹(我认为它已被删除)!
  • 如果您使用的是Gradle,请删除构建文件夹!

答案 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的父目录“文件。