Orthogonalité et Swing

Wed, 02/16/2011 - 14:20 — Serge Rosmorduc

Un peu de philosophie... Dans les sources de JSesh, on trouve actuellement un petit framework applicatif (org.qenherkhopeshef.guiFramework). Celui-ci a été créé avec dans l'idée de disposer d'un système simple, indépendant de tout IDE, pour créer des applications multilingues.

Dans ce framework, l'exécution des actions est déléguée à un objet de type façade. Je me base sur une classe proposée dans un article de Hans Muller sur java.net. Cette classe, BundledAction, représente une action

Le tout ne fonctionne pas trop mal. Vous pouvez jeter un œil à une petite application de démo dans org.qenherkhopeshef.guiFramework.demo.simple. Le système permet de configurer assez simplement les actions, et gère leur activation.

Cependant, j'étais bloqué pour le passage à l'échelle... dans mon application réelle (JSesh, quoi), j'avais plusieurs actions déjà écrites (et de plus, le système de délégation multiplie le nombre de méthodes de la façade au delà du raisonnable). Ces action préexistantes me posaient bien évidemment un problème.

Le framework de JHotdraw, quant à lui, gère différemment l'initialisation des actions. Il met en place une classe ResourceBundleUtil, et un simple appel

  DoSomethingAction myAction= new DoSomethingAction();
  ResourceBundleUtil.getBundle("jsesh.jhotdraw.labels").configureAction(myAction, "edit.doSomething");

permet d'initialiser les propriétés de l'action à partir du fichier de propriétés (ici jsesh.jhotdraw.labels.properties).

Cette approche est bien meilleure du point de vue de la modélisation. En effet, la BundledAction de tout à l'heure a deux caractéristiques orthogonales : la manière dont elle s'exécute d'une part, et la manière dont elle est initialisée d'autre part.

Le ResourceBundleUtil permet d'initialiser n'importe quelle action, sans demander qu'elle implémente un type particulier.