Meilleure pratique d’utilisation d’actions réutilisables sur les composants d’interface graphique

J’ai essayé de faire différentes choses sur la façon de rendre les actions resable dans mes applications Swing. Je ne suis pas un ami des classes de poids lourds, plus de 1 000 (avec beaucoup de classes internes / anon) et j’essaie de scinder mon code en plusieurs classes. Rendez-les ainsi facilement échangeables.

Pour réutiliser les mêmes actions dans une application, j’ai créé pour chaque action sa propre classe afin de l’utiliser dans JMenuBar et JToolBar . S’il vous plaît jeter un oeil à l’exemple minimal ci-dessous.

Est-ce une bonne pratique choisie (en particulier en utilisant des classes internes statiques)?

public class SomeGUI extends JFrame { public static void main(Ssortingng[] args) { new SomeGUI(); } public SomeGUI() { setJMenuBar(new MyMenuBar()); add(new MyToolBar()); setSize(400, 400); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } } class MyMenuBar extends JMenuBar { JMenu menu = new JMenu("File"); public MyMenuBar() { add(menu); menu.add(new JMenuItem(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N))); } } class MyToolBar extends JToolBar { public MyToolBar() { add(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N)); } } class Actions { static class NewAction extends AbstractAction { public NewAction(Ssortingng name, ImageIcon icon, Ssortingng desc, Integer mnemonic) { super(name, icon); putValue(SHORT_DESCRIPTION, desc); putValue(MNEMONIC_KEY, mnemonic); } @Override public void actionPerformed(ActionEvent paramActionEvent) { System.out.println("do the new action..."); } } } 

Dans l’attente de vos conseils. Merci d’avance.

Est-ce une bonne pratique choisie (en particulier en utilisant des classes internes statiques)?

C’est ainsi que la majeure partie du code Swing de base est implémentée.

Par exemple, examinez le code source de DefaultEditorKit où toutes les actions sont définies.

Une suggestion serait de ne pas utiliser une classe d’agrégat contenant toutes les actions. Utilisez simplement un fichier séparé pour chaque classe et rendez-le public.

Pour utiliser la classe dans un autre projet, il vous suffira de copier le fichier en supposant qu’il ne possède pas de dépendances spécifiques dans le projet en cours.

Ce que je fais souvent (et c’est encore plus facile lorsque GutsAction partir d’un projet guts-gui ), c’est de regrouper les actions associées dans une classe.

Je stocke chaque action en tant que champ final public (mais si vous détestez public champs public , vous pouvez toujours les rendre private et définir une méthode de lecture sur chacune d’elles).

Chaque action est définie comme une petite classe anonyme dans laquelle le champ final est déclaré.

Les critères de regroupement sont essentiellement fonctionnels, mais ils peuvent également inclure un certain contexte. Par exemple, vous pouvez avoir une classe comprenant diverses actions exécutées sur l’ordre sélectionné (à partir d’un ordre JTable ). Je peux donc le mettre en contexte dans une seule classe, et je peux aussi y mettre les méthodes nécessaires pour activer / désactiver toutes les actions lorsque la sélection change.

Le fait de regrouper des actions dans une classe permet d’éviter la prolifération de classes d’action partout et de devoir gérer l’instanciation de chaque action. Il permet également d’injecter plus facilement des dépendances communes à plusieurs actions.