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を使用するときにこれをどのように処理するのが最適かについて、誰かが洞察を持っていますか?
ファイルをmain/resourcesディレクトリに移動しました。
私の場合、上記のすべてがまったく問題ではありませんでした。
私が交換したときに私の問題は解決しました:
getClass().getResource("ui_layout.fxml")
で:
getClass().getClassLoader().getResource("ui_layout.fxml")
URL url = new File("src/main/Java/ua/adeptius/goit/sample.fxml").toURI().toURL();
Parent root = FXMLLoader.load(url);
それは私のために助けられます
getClass.getResource("path")
常にnullを返します。
このエラーは数回見ました。あまりにも頻繁に、私は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プロジェクトであるため、リソースはリソースフォルダーに関連するため、次のようになります。
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に問題があることを意味します:
メッセージ内。この時点で、FXMLを読み、問題を特定できるかどうかを確認する必要があります。関連する質問のいくつかのヒントを試すことができます。
この問題に関して、私の意見では、ファイル名は大文字と小文字が適切でした: "Main.fxml"。ファイルが移動されたときに、おそらく名前が変更されたか、文字列が再入力されました。幸運を。
関連する:
の代わりに
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
プット
Parent root = FXMLLoader.load(getClass().getResource("/main.fxml"));
違いは「/」です。
理由:
1つ目:getResourceはパッケージに関連するリソースを見つけようとします
2番目:getResourceはそれを絶対パスとして扱い、単にクラスローダーを呼び出します。
ドキュメント[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
使えなかった
getClass().getResource("views/view.fxml")
コントローラークラスを「コントローラー」パッケージに入れたため、ここに私のソリューションがあります。
getClass().getResource("../views/view.fxml")
この問題は、FXMLファイルへの誤ったパスが原因で発生する可能性があります。
絶対パス(my/package/views/view.fxml
)、その前にスラッシュを付ける必要があります。
getClass().getResource("/my/package/views/view.fxml")
相対パスも使用できます。
getClass().getResource("views/view.fxml")
同じエラーが発生していました。私の場合、fxmlファイル名に先頭のスペース記号がありました。
「fxml_example.fxml」ではなく「fxml_example.fxml」
どこから来たのかわかりません。気づくのは非常に困難でした。先頭のスペースを削除すると、すべてがうまくいきました。ファイル名がスペース記号で始まることも知りませんでした。
あなたの問題がMaven関連ではなく、ブラウザでこれを実行しているのと同じNullPointerExceptionを取得する場合(IDEで問題ありません)、これを試してください:
-> Netbeans->プロジェクトを右クリック->プロパティ->ビルド->展開->「無制限のアクセスをリクエスト(署名、自己署名を有効にする)」をチェック
これは、FXMLマークアップから値を注入するためのアクセス許可が必要な@FXMLアノテーションによるものです( http://docs.Oracle.com/javafx/2/fxml_get_started/fxml_deployment.htm を参照)
JDK8u31でアプリを実行していましたが、Chrome/Firefox/IE。
上記のソリューションはすべて、プロジェクトを再構築するためにIDEをトリガーします。魔法は関係ありません。
この問題の「本当の」解決策は、以前のビルドディレクトリを捨てるべきだということです。
上記の答えを試してみましたが、私のプロジェクトではうまくいきませんでした。私のプロジェクトはmaven
とopenjfx
をWindowsで使用していました。これで問題が解決しました:
fxmlLoader FXMLLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/main.fxml"));
root = fxmlLoader.load()
ローダーのルートディレクトリは、Mavenプロジェクトの「resources」フォルダーにあります。したがって、src/main/Java
その後、fxmlファイルのパスはsrc/main/resources
https://maven.Apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
プロジェクトがMavenベースの場合、Ideaはsrc/main/Javaフォルダー内のJavaファイルを除くすべてを無視します。前述のように、src/main/resourcesへのファイルの移動は機能しますが、SceneBuilderはコントローラークラスが完全に異なるディレクトリにあり、すべての洞察を失うため、コントローラークラスについてもう知っています。盲目的に構築します。
SceneBuilder [〜#〜] expects [〜#〜]コントローラークラスを見つけるために、これはintellijの問題だと思いますJavaのファイル(および引用符)) 「同じディレクトリ、直接のサブディレクトリ、または.fxmlの親ディレクトリ」ドキュメント。
時々同じ例外がありました。
EclipseでWizardを使用してFXML-Fileを作成する場合、名前フィールドにexample.fxmlと記述します。Eclipseはexample .fxml.fxml。この間違いにより、FXMLLoaderは適切なFXML-Fileを見つけることができません。
私が助けてくれることを願っています。幸運を。