Bonsoir,
Tout d'abord, je sais pas vraiment si ça s'appelle bien des références croisées, mais je pense que ca lui va bien.
Je suis en train de développer une application en utilisation le MVC, même le M(VC)C. C'est à dire que j'ai aussi un contrôleur purement Swing (ActionController) qui gère les actions des mes interfaces et un contrôleur de la vue générique (Controller).
Voilà mon problème : Au début de mon programme, je demande à mon programme de charger toutes les actions du programme.
Voilà en épuré la classe qui va faire cela :
Le problème c'est que lorsqu'il éxécuter la méthode loadAction de AboutActionActionController, ca va appeller le constructeur d'une action (AcDisplayLicence) qui lui va utiliser ControllerFactory :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 public class ActionControllerManager { private static ArrayList<ActionController> controllers = null; private static MyLogger logger = MyLoggerFactory.getLogger(ActionControllerManager.class); static { controllers = new ArrayList<ActionController>(); controllers.add(new AboutActionController()); controllers.add(new ConfigActionController()); controllers.add(new StatsActionController()); controllers.add(new FilmActionController()); controllers.add(new JThequeActionController()); } /** * Retourne un controlleur en fonction du type passé en paramètre * @param controllerType Le type de controlleur voulu * @return Le controlleur adéquat */ public static ActionController getController(int controllerType){ logger.debug("Get controller " + controllerType); for(ActionController controller : controllers){ if(controller.canControl(controllerType)){ logger.debug("Return controller " + controller); return controller; } } logger.debug("Controller not found, return null"); return null; } /** * Charge toutes les actions des différents controlleurs * @throws ActionLoaderException Cette exception est levée s'il y a eu une erreur durant le chargement des * actions */ public static void loadAllActions() throws ActionLoaderException{ for(ActionController controller : controllers){ boolean good = controller.loadActions(); if(!good){ ActionLoaderException exception = new ActionLoaderException("Les actions n'ont pas pu être chargées correctement"); if(controller.getException() != null){ exception.initCause(controller.getException()); } throw exception; } } } }
Voici le code de AcDisplayLicence :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public class ControllerFactory { private static ArrayList<Controller> controllers = null; static { controllers = new ArrayList<Controller>(); controllers.add(new JThequeController()); controllers.add(new UpdateController()); } public static Controller getController(int controllerType){ for(Controller controller : controllers){ if(controller.canManage(controllerType)){ return controller; } } return null; } }
Malheureusement, le fait d'initialiser JThequeController initialise aussi l'interface graphique et cette interface a besoin de JThequeActionController pour récupérer les actions, malheureusement, a ce moment là de l'éxécution, la méthode loadAction n'es pas encore lancée, je récupère donc logiquement des actions encore nulles et mon interface graphique est toute vide...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class AcDisplayLicence extends MyAction { private static final long serialVersionUID = -5130253480109588863L; private LicenceController controller = (LicenceController)ControllerFactory.getController(Constantes.Controllers.LICENCE); public void actionPerformed(ActionEvent e) { controller.displayView(); } }
Je sais pas si j'ai été bien clair, en plus le problème est assez compliqué... Mais quelqu'un aurait-il une idée ? Parce que là, j'ai un peu de peine... Mais je vais continuer à chercher.
Merci
Partager