web-dev-qa-db-ja.com

JavaFXプロジェクトの構造

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を使っています。

21
Xkynar

私見、あなたの意見に応じてパッケージを作成すべきではありません。

そのようなアプリケーションへの私のアプローチ

  • これらのcontrollersの対応するviewsのパッケージ
  • サービス(ビジネス)レイヤーとdao(持続)レイヤーの異なるパッケージ(存在する場合)
  • 画像、CSSなどのリソースのディレクトリ
  • リソース内の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プロジェクトです!

37
ItachiUchiha