web-dev-qa-db-ja.com

JavaFX「場所が必要です。」同じパッケージにあるにもかかわらず

JavaFXプログラムを実行しようとしていますが、いくつかの問題があります。 「Java.lang.NullPointerException:Location is required。」というエラーが引き続き表示されます。 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なしで作業を続行できます。 Mavenを使用するときにこれをどのように処理するのが最適かについて、誰かが洞察を持っていますか?

42
Gremash

ファイルをmain/resourcesディレクトリに移動しました。

39
Gremash

私の場合、上記のすべてがまったく問題ではありませんでした。

私が交換したときに私の問題は解決しました:

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

で:

getClass().getClassLoader().getResource("ui_layout.fxml")
69
Amir Arad
URL url = new File("src/main/Java/ua/adeptius/goit/sample.fxml").toURI().toURL();
Parent root = FXMLLoader.load(url);

それは私のために助けられます

getClass.getResource("path")

常にnullを返します。

21
Adeptius

このエラーは数回見ました。あまりにも頻繁に、私は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プロジェクトであるため、リソースはリソースフォルダーに関連するため、次のようになります。

  • 「/fxml/main.fxml」。
  • 先頭のスラッシュが必要です。
  • FXMLLoaderに渡されるリソースはcase-sensitiveです:

    // 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:file:/ D:/sandbox/javafx/app_examples/person/target/person-00.00.01-SNAPSHOT.jar!/fxml/tableWithDetails.fxml:13

ファイル内の行13に問題があることを意味します:

  • tableWithDetails.fxml:13

メッセージ内。この時点で、FXMLを読み、問題を特定できるかどうかを確認する必要があります。関連する質問のいくつかのヒントを試すことができます。

この問題に関して、私の意見では、ファイル名は大文字と小文字が適切でした: "Main.fxml"。ファイルが移動されたときに、おそらく名前が変更されたか、文字列が再入力されました。幸運を。

関連する:

19
will

の代わりに

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

プット

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

違いは「/」です。

理由:

1つ目:getResourceはパッケージに関連するリソースを見つけようとします

2番目:getResourceはそれを絶対パスとして扱い、単にクラスローダーを呼び出します。

10
minigeek

ドキュメント[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/javase/8/javafx/api/javafx/fxml/FXMLLoader.htm

3
james.garriss

使えなかった

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

コントローラークラスを「コントローラー」パッケージに入れたため、ここに私のソリューションがあります。

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

この問題は、FXMLファイルへの誤ったパスが原因で発生する可能性があります。

絶対パス(my/package/views/view.fxml)、その前にスラッシュを付ける必要があります。

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

相対パスも使用できます。

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

同じエラーが発生していました。私の場合、fxmlファイル名に先頭のスペース記号がありました。

「fxml_example.fxml」ではなく「fxml_example.fxml」

どこから来たのかわかりません。気づくのは非常に困難でした。先頭のスペースを削除すると、すべてがうまくいきました。ファイル名がスペース記号で始まることも知りませんでした。

2
Evaldas Ilginis

あなたの問題がMaven関連ではなく、ブラウザでこれを実行しているのと同じNullPointerExceptionを取得する場合(IDEで問題ありません)、これを試してください:

-> Netbeans->プロジェクトを右クリック->プロパティ->ビルド->展開->「無制限のアクセスをリクエスト(署名、自己署名を有効にする)」をチェック

これは、FXMLマークアップから値を注入するためのアクセス許可が必要な@FXMLアノテーションによるものです( http://docs.Oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm を参照)

JDK8u31でアプリを実行していましたが、Chrome/Firefox/IE。

2
mroesler

上記のソリューションはすべて、プロジェクトを再構築するためにIDEをトリガーします。魔法は関係ありません。

この問題の「本当の」解決策は、以前のビルドディレクトリを捨てるべきだということです。

  • Mavenを使用している場合は、ターゲットフォルダを削除するだけです(またはmvn cleanを実行してください)!
  • ANTを使用している場合、それぞれのフォルダーを削除します(呼び出されていると思います)。
  • Gradleを使用している場合は、ビルドフォルダーを削除してください!
1
John Smith

上記の答えを試してみましたが、私のプロジェクトではうまくいきませんでした。私のプロジェクトはmavenopenjfxをWindowsで使用していました。これで問題が解決しました:

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

ローダーのルートディレクトリは、Mavenプロジェクトの「resources」フォルダーにあります。したがって、src/main/Javaその後、fxmlファイルのパスはsrc/main/resources

https://maven.Apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

1
Thomas Bratt

プロジェクトがMavenベースの場合、Ideaはsrc/main/Javaフォルダー内のJavaファイルを除くすべてを無視します。前述のように、src/main/resourcesへのファイルの移動は機能しますが、SceneBuilderはコントローラークラスが完全に異なるディレクトリにあり、すべての洞察を失うため、コントローラークラスについてもう知っています。盲目的に構築します。

SceneBuilder [〜#〜] expects [〜#〜]コントローラークラスを見つけるために、これはintellijの問題だと思いますJavaのファイル(および引用符)) 「同じディレクトリ、直接のサブディレクトリ、または.fxmlの親ディレクトリ」ドキュメント。

0
Pedro Borges

時々同じ例外がありました。

EclipseでWizardを使用してFXML-Fileを作成する場合、名前フィールドにexample.fxmlと記述します。Eclipseはexample .fxml.fxml。この間違いにより、FXMLLoaderは適切なFXML-Fileを見つけることができません。

私が助けてくれることを願っています。幸運を。

0
budo