FXMLを使用したJavaFXのMVCモデルは素晴らしいサウンドですが、プロジェクトパッケージを整理する方法を見つけるのに苦労しています。
私がJavaFXについて見つけるすべてのチュートリアルは非常に単純で組織化されていません。それらは単に1つのパッケージを作成し、そこにすべて、すべてのコントローラー、すべてのfxml、すべてのCSSを作成します。それは欲しくない。私は物事が彼らの正しい場所にあることを望みます。
それでも、JavaFXの「パス」は...「限定的」のようです。 URLを使用すると、リソースをローカルファイルに制限したい場合は、getClass().getResource("foo.fxml").openStream()
全体を実行する必要があります。これはすばらしいことですが、クラスパスからリソースを取得することにより、パスはそのクラスが含まれているパッケージからのものになります。プロジェクトのルートが必要でした。それは私の人生を簡素化しますが、JavaFXはそのように動作しないようです。
実用的な例を見てみましょう:
FXMLの「ログイン画面」があるとします。そのログイン画面でスタイルシートを使用したいとします。理想的には、そのcssはそのfxmlの同じパッケージ内にあります。しかし、別のFXMLで同じ.cssを使用したい場合はどうなりますか?これは、両方のFXMLを同じパッケージに配置する必要があることを意味しますか?明らかに「する必要はありません」が、どうやってそれを行うのですか?
また、適切にログインしたときにシーンを変更したいとします。 FXML Controllerの適切なイベントでは、「setScene」を呼び出す必要があります。 FXMLが別のパッケージにある場合、そのパスを取得することも困難です。すべてが1つの巨大な肥大化したパッケージに入っているか、「../../ dir」のようなハックに頼らずにすべてにアクセスするのは難しいようです。
http://docs.Oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm のHenley Salesアプリケーションは、適切に構成されたアプリケーションの例のようですが、アプリケーションは単一ですTabPane。残念ながら(少なくとも、私はそう思います)ソースは公開されていません。そのアイデアは次のようなものです:
_client Main.class styles.css client.images image.png client.screen1 Screen1.fxml Screen1Controller.Java client.screen2 Screen2.fxml Screen2Controller.Java ...
_
これは不適切なスタートのように見えますが、いくつかの問題があります(または、少なくとも問題として認識しています)。
「The Henley Sales」の場合、パッケージのFXMLの1つを呼び出すMainがあると便利です(簡単にアクセスでき、FXMLのディレクトリはMainクラスの下にあります)。それでも、スタイルシートの場合は、scene.getStylesheets().add(...);
によってハードコーディングする必要があります。 FXMLでスタイルシートを選択できるようにしたいのですが。結局のところ、スタイルシートはViewコンポーネントの一部です。 FXMLのURLから.cssファイルにアクセスすることは、ディレクトリの上にあるため、この構造では少し難しいでしょう。
また、この組織では、どうやってシーンを競争的に変えるのでしょうか?このプロジェクトでは、プロジェクト全体が単一のTabbedPaneであるため、これは必要ありません。メインがそれを呼び出し、それが完了しました。これ以上スワップする必要はありません。ただし、単純なログインシーン(またはシーン全体をスワップする必要がある理由は何でも)では、FXMLパスにアクセスする必要があります。
そして、リソースがあります。 Cssファイルは画像を使用する必要があるかもしれません。この構造は、.cssファイルを上に配置し、.cssが必要とする可能性のあるファイルのみのパッケージを作成することで解決します。特定のFXMLに別の.cssを付けたい場合は、別の問題が発生します。
サイクルのようです。 Cssは共有リソースフォルダーにアクセスする必要があります。 FXMLはCssにアクセスする必要があります。 FXMLのコントローラーは、他のFXMLにアクセスする必要があります。私のプロジェクト構造についての疑問が明確になったことを願っています。基本的なアプリケーションよりも強力なJavaFXプロジェクト構造の作成を手伝ってください。または、いくつかの優れたソースコードにリダイレクトしてください。
ああ、ところでNetbeansを使っています。
私見、あなたの意見に応じてパッケージを作成すべきではありません。
そのようなアプリケーションへの私のアプローチ
controllers
の対応するviews
のパッケージリソース内のview
と呼ばれるFXMLファイルのディレクトリ
src/main
├──Java
├── controllers
├──Screen1controller.Java
├──Screen2controller.Java
├── service
├──Service1.Java
├── dao(persist)
├── SaveProducts.Java
├──resources
├──view
├──screen1.fxml
├──screen2.fxml
├──css
├──style.css
├──images
├──img1.jpg
├──img2.jpg
上記の実装は、Maven
プロジェクトで検討できます。
単純なプロジェクトの場合、 ここに構造 を表示できます。それはmavenプロジェクトです!