私はjavafx GUIアプリケーションを作成していますが、私のプロジェクトはMavenで構成されたプロジェクトです。コントローラーで次のようにfxmlファイルを参照できるようにしたい:
FXMLLoader.load(getClass().getResource("main.fxml");
Main.fxmlファイルはsrc/main/resourcesフォルダーにあり、コントローラーはsrc/main/Javaフォルダーにあります。これを行うにはどうすればよいですか?私のsrc/main/resourcesフォルダーはビルドパスにあり、src/main/resourcesフォルダーにある.propertiesファイルをsrc/main/Javaフォルダーのクラスから呼び出すことができます。
編集
メインリソースフォルダーの対応するディレクトリにfxmlファイルを配置しようとしました。
しかし、まだエラーが発生しました。
使用例
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load();
ロケーション解決オプション
すべてのfxmlをsrc/main/resourcesディレクトリに配置します。
loader.setLocation(getClass().getResource("/main.fxml"));
すべてのfxmlをsrc/main/resources/fxmlディレクトリに配置します。
loader.setLocation(getClass().getResource("/fxml/main.fxml"));
Fxmlを対応するリソースディレクトリに配置します。例えばsrc/main/resources/com/mycompany/myapp。
loader.setLocation(getClass().getResource("main.fxml"));
最後のオプションでは、fxmlのロード元のクラスが、対応するJavaソース階層内の同じ相対位置にあると想定しています。たとえば、ソースcom.mycompany.myapp.Main.Java
から最後のロードコマンドを呼び出すことができます。
FXMLLoaderの使用に関する推奨事項
FXMLLoaderの静的メソッド を使用するのではなく、new FXMLLoader()
を介してFXMLLoaderをインスタンス化します。
インスタンス化されたFXMLLoaderで 場所を設定 し、 load()
を使用してストリームからロードするのではなく、 load(stream)
を呼び出します。
クラスに基づいて場所を導出するには、URLベースであるため、ストリームベースの getClass().getResource()
ではなく、 getClass().getResourceAsStream()
を使用します。
IDEおよびビルド設定
IDEまたはビルドツールがリソースディレクトリからビルド出力ディレクトリにfxmlファイルをコピーしていることを確認します。このためのIntellij設定を理解するには、 intellijの通常のJavaプロジェクトをJavaFxプロジェクトに変換する方法 を参照してください。
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("main.fxml") );
を使用してmain.fxmlをロードしています。これには、main.fxmlとJavaクラスを同じディレクトリ/パスにロードするクラスが必要です。fxmlファイルをJavaクラスをロードするには、相対パスを使用する必要があります。上記の@jewelseaのように、main.fxmlの前に/文字を使用して相対パスを使用することができます。
FXMLLoader fxmlLoader = new FXMLLoader( getClass().getResource("/main.fxml") );
オペレーティングシステムのエクスプローラーでリソースフォルダーを開きます。ここでは、「dominion」フォルダー内に「application」フォルダーの代わりに「dominion.application」フォルダーを作成したことがわかります。このため、「MainController」クラスはfxmlファイルとは別のパッケージに配置されます。