web-dev-qa-db-ja.com

リソースフォルダー内のjavafx fxmlファイルを参照する方法

私は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ファイルを配置しようとしました。

enter image description here

しかし、まだエラーが発生しました。

28
j will

使用例

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/main.fxml"));
Parent content = loader.load(); 

ロケーション解決オプション

  1. すべてのfxmlをsrc/main/resourcesディレクトリに配置します。

    loader.setLocation(getClass().getResource("/main.fxml"));
    
  2. すべてのfxmlをsrc/main/resources/fxmlディレクトリに配置します。

    loader.setLocation(getClass().getResource("/fxml/main.fxml"));
    
  3. Fxmlを対応するリソースディレクトリに配置します。例えばsrc/main/resources/com/mycompany/myapp。

    loader.setLocation(getClass().getResource("main.fxml")); 
    

最後のオプションでは、fxmlのロード元のクラスが、対応するJavaソース階層内の同じ相対位置にあると想定しています。たとえば、ソースcom.mycompany.myapp.Main.Javaから最後のロードコマンドを呼び出すことができます。

FXMLLoaderの使用に関する推奨事項

  1. FXMLLoaderの静的メソッド を使用するのではなく、new FXMLLoader()を介してFXMLLoaderをインスタンス化します。

    • 静的メソッドは、ローダーから get values (インスタンス化されたコントローラーなど)を使用する場合に混乱します。
  2. インスタンス化されたFXMLLoaderで 場所を設定 し、 load() を使用してストリームからロードするのではなく、 load(stream) を呼び出します。

    • ローダーでURLベースの場所を設定すると、fxmlおよびcssファイルにロードされた相対リソースの解決が可能になります。ストリームベースのコンストラクターの相対リソースは解決されません。
  3. クラスに基づいて場所を導出するには、URLベースであるため、ストリームベースの getClass().getResource() ではなく、 getClass().getResourceAsStream() を使用します。

IDEおよびビルド設定

IDEまたはビルドツールがリソースディレクトリからビルド出力ディレクトリにfxmlファイルをコピーしていることを確認します。このためのIntellij設定を理解するには、 intellijの通常のJavaプロジェクトをJavaFxプロジェクトに変換する方法 を参照してください。

88
jewelsea

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") );
5
Dil

オペレーティングシステムのエクスプローラーでリソースフォルダーを開きます。ここでは、「dominion」フォルダー内に「application」フォルダーの代わりに「dominion.application」フォルダーを作成したことがわかります。このため、「MainController」クラスはfxmlファイルとは別のパッケージに配置されます。

0
Hendrik Ebbers