2009-06-15 7 views
2

J'ai une question sur la conception de l'interface graphique, en particulier avec Java Swing et la création d'une séparation nette entre la présentation et le modèle.GUI: Modification des panneaux en fonction de la valeur de la zone de liste déroulante

C'est un peu difficile à décrire, mais nous avons essentiellement beaucoup de données de référence dans notre système (c'est-à-dire qui correspondraient à des tables de recherche dans la base de données). Nous voulons que les gens puissent les éditer tous à partir d'un seul écran. Donc, dans un monde idéal, ce que nous aimerions, c'est une liste déroulante dans le coin supérieur gauche avec une liste de 'types' de données de référence (donc chacune correspondant à une table dans la base de données).

Ensuite, une fois sélectionnée, une liste des données est remplie ci-dessous, ainsi qu'un filtre (ou un champ de recherche). Lorsque l'un de ces éléments est sélectionné, le panneau de droite est activé, ce qui permet d'éditer les données réelles. Maintenant, voici le problème: chaque type de données que nous devons éditer est différent, donc il a différents champs etc. Nous pourrions aller avec une solution générique mais je ne suis pas vraiment fan d'eux - il y a beaucoup de différentes règles de validation pour chaque etc, même pour différents clients, et ce serait un cauchemar à gérer. Nous utilisons le modèle Presentation Model pour obtenir un certain degré de séparation entre le code GUI et le modèle, mais je ne peux pas penser à une manière propre de faire cela qui ne brouille pas en quelque sorte la ligne de responsabilités.

Comment avez-vous résolu des problèmes comme celui-ci?

[Note: Désolé pour la longue question, espérons qu'il est compréhensible, je peux reformuler si nécessaire]

Répondre

1

Vous pouvez utiliser le Factory Pattern pour créer un widget de l'interface utilisateur pour l'élément que vous sélectionnez. Vous pouvez également l'utiliser pour créer un objet de règle de validation en fonction du type. Cela vous donnerait une partie de la flexibilité que vous désirez.

Ainsi, vous pouvez avoir quelque chose comme:

IWidget widget = UIFactory.createFor(myObject.getType()) 

qui peut être invoqué à l'événement de sélection pour créer le droit widget pour modifier l'élément sélectionné.

Le IWidget pourrait avoir des méthodes telles que:

validateData() 
refreshData() 
setDataElement(IDataElement element) 

qui vous permettra de traiter tous les UI widgets génériquement, mais qui ont encore un widget interface utilisateur spéciale pour chaque type d'élément. Je suppose que les éléments que vous sélectionnez dans la table implémentent tous une interface IDataElement qui contient la méthode getType(). J'ai utilisé cette solution associée au mécanisme d'extension Eclipse pour brancher de nouveaux éléments d'interface utilisateur dans ma solution de base, pour avoir un cœur extensible et un haut niveau de réutilisation. Vous pouvez réaliser quelque chose de similaire en injectant des types et des widgets dans votre usine, manuellement ou avec Spring.

+0

Merci, c'était utile! :) –

0

Si vous ne voulez pas descendre le chemin générique, vous pouvez demander à votre modèle de conserver un mappage de l'élément de zone de liste déroulante -> nom de panneau à utiliser avec un CardLayout. Vous pouvez ensuite créer des panneaux personnalisés pour l'édition de chacun des types de données de référence. Lorsque la sélection de la zone de liste déroulante est modifiée, vous pouvez enregistrer l'état actuel dans votre modèle, demander le nom du panneau de la sélection actuelle, préparer votre panneau suivant pour l'affichage, puis demander à votre CardLayout de l'afficher.

Questions connexes