Une solution simple pour faire du MVC2 avec JavaFX

Faire du MVC2 simplement avec JavaFX

De par son architecture interne, JavaFX utilise intensivement la réflexion et l'injection de code. De plus, JavaFX insiste pour créer lui-même les instances des contrôleurs de chaque ihm.

Dans ces conditions, la tâche de maintenir une architecture MVC2 est rendue plutôt compliquée et la tendance est de ne pas en faire.

Malheureusement, par expérience, dès que le projet prend du volume et sans la guidance qu'offre une structure comme MVC2, on se retrouve assez vite avec une belle salade de code qui traverse toutes les couches et, pire, avec du code métier un peu partout notamment dans les contrôleurs des ihms...

Une solution simple à ce problème est d'utiliser les quelques classes que je vous fournis ici. Cela résout ce problème et permet de continuer à utiliser l'architecture MVC2 que vous connaissez déjà, et ce, très facilement.

Bonus : vous pourrez même utiliser des ihm Swing et JavaFX dans le même projet.

La solution est fournie en 2 étapes :
- des explication qu'il vous faut lire et comprendre dans tous les cas de figure
- deux projets JavaFX de base et de démonstration, que vous pouvez ensuite librement modifier et adapter à votre sauce

A lire et à comprendre - les bases pour utiliser l'option N°1 ou l'option N°2

Les bases nécessaires pour utiliser cette solution technique

Ce qui change pour le Wrk :

=> Absolument rien du tout !

Ce qui change pour le Ctrl :

=> Il devra hériter de la classe BaseCtrl

En clair, il devra avoir le code suivant :
   public class Ctrl extends BaseCtrl implements ICtrlWrk, ICtrlIhm {...}

C'est ce qui mettra en place la magie nécessaire pour que l'application ait son propre contrôleur unique, indépendant de ceux créés par JavaFX.

Ce qui change pour l'Ihm "principale" :

=> elle devra hériter de la classe BaseIhmPrincipale
=> elle devra du coup surcharger quelques méthodes abstraites simples (pour par exemple indiquer le fichier FXML à utiliser)
=> Il devra toujours y avoir exactement une ihm principale (les autres seront des ihm dites secondaires, c.f. point suivant) 

En clair, elle devra avoir le code suivant :
   public class Ihm extends BaseIhmPrincipale implements IIhmCtrl { ... }

C'est ce qui mettra en place plusieurs magies nécessaires, notamment celle permettant à l'Ihm principale de retrouver le lien avec le contrôleur MVC2 de l'application. De plus, il faut savoir que l'attribut refCtrl est déjà déclaré dans la classe mère BaseIhmPrincipale. Il y est déjà initialisé et géré par cette classe mère, vous n'avez donc plus rien à faire si ce n'est de l'utiliser via getRefCtrl() pour pouvoir discuter avec votre contrôleur MVC2 :-)

Les méthodes à obligatoirement surcharger (marquées asbtract) sont :
- getStageFXMLNameURL() pour indiquer le fichier FXML à utiliser
- getStageTitle() pour donner un titre à la fenêtre
- etatIhm_1_ChargeeEtInvisible() qui permet de faire qqch lorsque la fenêtre est prête mais juste pas encore visible
- etatIhm_4_VaQuitter() qui permet de faire qqch juste avant que la fenêtre ne soit définitivement quittée

D'autres méthodes peuvent être surchargée, si intérêt pour vos besoins. Le nom et le numéro de ces méthodes montrent clairement le cycle de vie des fenêtres dans JavaFX :
- etatIhm_2a_BientotVisible()
- etatIhm_2b_Visible()
- etatIhm_3a_BientotInvisible()
- etatIhm_3b_Invisible()

Ce qui change pour les ihm "secondaires" :

Les ihm "secondaires" sont les ihm ouvertes par l'ihm principale sur une action de l'utilisateur.
=> s'il y en a, elles devront hériter de la classe BaseIhm
=> pour le reste, fonctionnement identique à BaseIhmPrincipale 

En clair, elles devront avoir le code suivant :
   public class IhmSecondaire extends BaseIhm { ... }

C'est ce qui mettra en place la magie nécessaire pour retrouver l'Ihm principale via getRefIhm() et facilement discuter avec elle. Pour en lancer une depuis l'ihm principale, une ligne suffit, par exemple :
   new IhmReglages().createAndShowStage();

Où se trouvent ces nouvelles classes ?

Ces classes "fait maison" se trouvent dans le package javafx_mvc2 des projets fournis. Ne touchez pas au code que ce package contient.

Bonus :

Une classe EasyPopups est également fournie (cadeau :-) dans le package javafx_mvc2.

Elle vous permettra de facilement afficher des alertes pour l'utilisateur, comme des erreurs, des questions de type oui/non ou des informations, à l'aide de ses 3 méthodes statiques simples :
- afficheInformation( String msgInformation )
- afficheErreur( String msgErreur )
- boolean afficheQuestion( String msgQuestion )

Conseils d'utilisation :

Dans le doute, jetez un oeil au code fourni dans le projet fonctionnel (option N°1), il vous guidera et devrait répondre à toutes vos questions.

Dans le cas contraire, je me ferai un plaisir de vous aider : contactez-moi !

Option 1 : la solution "rapide"

Option 1 : partir d'un projet existant et l'adapter à vos besoins

Voici deux projets Netbeans de démonstration complets et simples, à télécharger, qui utilisent : Java + JavaFX + MVC2 + Swing + mes classes extra.

Le premier projet JavaFXMVC2Base ne contient que le strict minimum.
Il est à voir plutôt comme une base de départ minimaliste
Cliquez ici pour télécharger JavaFXMVC2Base

Le second projet MeteoMVC2JavaFX-FXML contient un projet de démonstration simple avec 3 ihms. La principale est en FXML et permet d'obtenir des prévisions météo aléatoires. Deux ihm secondaires permettent d'accéder aux réglages/options de l'application (IhmReglages) et d'afficher les différents états d'une fenêtre (IhmEtats).
A voir plutôt comme une base de départ déjà fonctionnelle
Cliquez ici pour télécharger MeteoMVC2JavaFX-FXML

Option 2 : incorporer ces classes et refactorer le tout

Option 2 : partir de votre projet et l'adapter

1) Récupérez le package javafx_mvc2 de l'un des 2 projets fournis et incorporez-le dans votre projet NetBeans.
2) Réalisez toutes les modifications à votre projet qui sont expliquées ci-dessus dans "Les bases nécessaires".
3) Transformez votre projet en respectant les préceptes MVC2 enseignés.

Merci pour tous ces retours encourageants !

Ce que les utilisateurs en disent

A faire !

Qui

Titre

A faire !

Qui

Titre

A faire !

Qui

Titre