web-dev-qa-db-fra.com

Structure de projet JavaFX

Le modèle MVC de JavaFX en utilisant FXML semble génial et tout mais j'ai du mal à savoir comment organiser mes packages de projet.

Chaque tutoriel que je trouve sur JavaFX est beaucoup trop simple et non organisé: ils créent simplement UN paquet et créent tout là-bas, chaque contrôleur, chaque fxml, chaque css. Je ne veux pas ça. Je veux que les choses soient à leur place.

Pourtant, le "chemin" de JavaFX semble ... "limitif". L'utilisation d'URL fait en sorte que si je veux limiter mes ressources aux fichiers locaux, je dois faire toute la chose getClass().getResource("foo.fxml").openStream(). C'est génial, mais en obtenant des ressources à partir d'un chemin de classe, le chemin provient du package dans lequel se trouve la classe. Je voulais en quelque sorte la racine du projet. Cela simplifierait ma vie, mais JavaFX ne semble pas fonctionner comme ça.

Voyons un exemple pratique:

Imaginez que j'ai un "écran de connexion" FXML. Imaginez que je souhaite que cet écran de connexion utilise une feuille de style. Idéalement, ce css serait dans le même package que ce fxml. Mais que faire si je veux utiliser le même .css dans un autre FXML? Cela signifierait-il que je dois placer les deux FXML dans le même package? Évidemment, je n'en ai pas besoin, mais comment puis-je le faire alors?

Aussi, disons que je veux changer de scène lorsque je me connecte correctement. Dans l'événement approprié du contrôleur FXML, je devrais appeler un "setScene". Ce chemin serait également difficile à obtenir car si j'ai le FXML dans différents packages. Il semble juste que tout soit dans un seul paquet géant ou tout soit difficile d'accès sans avoir recours à des hacks comme "../../dir".

L'application Henley Sales dans http://docs.Oracle.com/javafx/2/best_practices/jfxpub-best_practices.htm semble être un exemple d'application bien organisée, bien que l'application soit une seule TabPane. Malheureusement (du moins je pense) la source n'est pas ouverte. Son idée est quelque chose comme ceci:

client
  Main.class
  styles.css
      client.images
          image.png
      client.screen1
          Screen1.fxml
          Screen1Controller.Java
      client.screen2
          Screen2.fxml
          Screen2Controller.Java
      ...

Cela ne semble pas être un mauvais début, mais il a quelques problèmes (ou du moins je les vois comme des problèmes).

Pour "The Henley Sales", il est judicieux d'avoir un Main qui appellerait l'un des packages FXML (accès facile, les répertoires FXML sont en dessous de la classe Main). Pourtant, pour la feuille de style, cela devrait être codé en dur par scene.getStylesheets().add(...);. Je préférerais vraiment avoir le choix de choisir ma feuille de style dans le FXML. Après tout, la feuille de style fait partie du composant View. Accéder au fichier .css à partir d'une URL dans le FXML serait un peu difficile avec cette structure, car elle se trouve au-dessus de leurs répertoires.

De plus, avec cette organisation, comment changer de scène en compétition? Dans ce projet, cela n'est pas nécessaire car l'ensemble du projet est un seul TabbedPane. Main l'appelle, et c'est fait. Plus besoin de swaps. Mais une simple scène de connexion (ou quelle que soit la raison pour laquelle il faudrait échanger la scène entière) appelle la nécessité d'accéder aux chemins FXML.

Et puis il y a les ressources. Les fichiers CSS peuvent avoir besoin d'utiliser des images. Cette structure le résout en plaçant le fichier .css sur le dessus et en créant un package juste pour les fichiers dont le .css pourrait avoir besoin. Si je voulais qu'un FXML particulier ait un .css différent, alors, un autre problème arriverait.

Cela ressemble à un cycle. CSS a besoin d'accéder à un dossier de ressources partagées. FXML doit avoir accès à Css. Les contrôleurs FXML doivent avoir accès à d'autres FXML. J'espère avoir été clair sur mes doutes sur la structure de mon projet. Aidez-moi à créer une structure de projet JavaFX suffisamment puissante pour une application plus que basique, ou redirigez-moi vers un bon code source.

Oh, j'utilise Netbeans au fait.

21
Xkynar

À mon humble avis, vous ne devriez pas créer de packages en fonction de vos vues.

Mon approche envers de telles applications

  • Un package pour les controllers correspondants de ces views
  • Différents packages pour la couche service (entreprise) et dao (persistance), s'il existe
  • Un répertoire pour les ressources telles que les images, css, etc.
  • Un répertoire pour les fichiers FXML appelé view dans les ressources

    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
    

L'implémentation ci-dessus peut être envisagée pour un projet Maven.

Pour un projet simple, vous pouvez voir une structure ici . C'est un projet maven!

37
ItachiUchiha