2013-10-26 48 views
18

私はjavafx GUIアプリケーションを作成しています。私のプロジェクトはmaven設定のプロジェクトです。私は私のコントローラでは、このような私のFXMLファイルを参照できるようにしたい:リソースフォルダ内のjavafx fxmlファイルを参照するには?

私main.fxmlファイルはsrc/main/resourcesフォルダに配置され、私のコントローラは、SRC /メイン/ Javaである
FXMLLoader.load(getClass().getResource("main.fxml"); 

フォルダ。これをどうやってやるの?私のsrc/main/resourcesフォルダはビルドパスにあり、src/main/javaフォルダ内のクラスからsrc/main/resourcesフォルダにある.propertiesファイルを呼び出すことができます。

編集

私は、メインのリソースフォルダの対応するディレクトリにFXMLファイルを配置しようとした:

enter image description here

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

答えて

57

使用例

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

場所解決オプション

  1. は、src/main/resourcesディレクトリにあなたのFXMLのすべてを置きます。

    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から最後のloadコマンドを呼び出すことができます。

FXMLLoader使用推奨

  1. むしろ static methods on the FXMLLoaderを使用するよりもnew FXMLLoader()介しFXMLLoaderをインスタンス。あなたは、ローダのうち、get valuesに(インスタンス化 コントローラのように)したいとき

    • 静的メソッドは、混乱になる 。インスタンス化FXMLLoaderに
  2. Set the locationむしろ load(stream)を使用してストリームからのロードより load()を呼び出します。ローダー上のURLベースの場所の設定

    • はFXMLファイルとCSSファイルにロードされた 相対的資源の解決が可能になります。相対的な リソースは、ストリームベースのコンストラクタでは解決されません。
  3. むしろストリームベースである getClass().getResourceAsStream()よりURL基づいて、あるとして、 getClass().getResource()を使用し、クラスに基づいて位置を導出します。

IDEと設定

を構築し、あなたのIDEやツールを構築していることを確認したリソースディレクトリからビルド出力ディレクトリにFXMLファイルをコピーしています。 Intellijの設定については、How to convert a normal java project in intellij into a JavaFx projectを参照してください。

+0

あなたの例ではまだ静的メソッドを使用しています。 getResourceの代わりにgetResourceAsStreamを呼び出す必要があります。 –

+2

Felixに感謝し、答えを明らかにしました。 3年28アップフォースと誰も以前の答えでこの異常を指摘していた;-) – jewelsea

+0

私は '/'を開始フォルダの前に置かなかったので、今度は失敗していました。私。 'getClass()。getResource(" fxml/main.fxml ")'。 – sudoman

4

あなたは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")); 
0

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

関連する問題