Le modèle MVC et le Swing
L'un des modèles de conception que je trouve le plus difficile d'obtenir une vraie prise de dans la "vraie Swing vie" est le modèle MVC. J'ai été au travers de pas mal de posts à ce site qui, de discuter le modèle, mais je n'ai toujours pas l'impression que j'ai une compréhension claire de la façon de prendre avantage de la répétition dans mon application Java Swing.
Disons que j'ai une JFrame qui contient une table, un couple de champs de texte et quelques boutons. Je serais probablement utiliser un TableModel pour "combler" le JTable avec un sous-jacent au modèle de données. Cependant, toutes les fonctions de chargé de la compensation des champs, de la validation des champs, le verrouillage des champs avec les actions de bouton avait l'habitude d'aller directement dans la JFrame. Cependant, ne pas mélanger le Contrôleur et la Vue du modèle?
Aussi loin que je peux voir, j'ai réussi à obtenir le modèle MVC "correctement", mis en œuvre lors de la recherche à la JTable (et le modèle), mais les choses deviennent boueux quand je regarde l'ensemble de la JFrame dans son ensemble.
J'aimerais vraiment entendre comment les autres vont à propos à cet égard. Comment allez-vous quand vous en avez besoin pour afficher une table, un couple de champs et des boutons pour un utilisateur en utilisant le modèle MVC?
- Voici une relative exemple.
- Pour quelqu'un d'autre de venir à cette partie - Swing n'est PAS un pur MVC - qu'il emprunte lourds du concept, mais "s'effondre" la "la vue et le contrôleur" ensemble
Vous devez vous connecter pour publier un commentaire.
Un livre que je recommande fortement à vous pour MVC dans swing serait "la Tête la Première Patrons de Conception" par Freeman et Freeman. Ils ont une très explication détaillée de la MVC.
Source (Dans le cas où vous vous demandez ce qu'est un "crémeux contrôleur" est, pense un biscuit Oreo, avec le contrôleur de la crème du centre, la vue du haut de biscuit et le modèle le fond de biscuit.)
De messagerie unifiée, dans le cas où vous êtes intéressé, vous pouvez télécharger un assez divertissant chanson sur le modèle MVC de ici!
Un problème que vous pouvez rencontrer avec Swing de programmation consiste à amalgamer le SwingWorker et EventDispatch fil avec le modèle MVC. Selon votre programme, votre point de vue ou le contrôleur peut avoir à étendre le SwingWorker et remplacer le
doInBackground()
méthode où l'exploitation intensive des ressources de la logique est placé. Cela peut facilement être fusionnée avec la typique du modèle MVC, et est typique des applications Swing.EDIT #1:
En outre, il est important de considérer MVC comme une sorte de composite de différents motifs. Par exemple, votre modèle pourrait être mis en œuvre en utilisant le modèle Observateur (nécessitant la Vue à être inscrit en tant qu'observateur pour le modèle), tandis que votre contrôleur peut utiliser le modèle de Stratégie.
EDIT #2:
J'aimerais aussi répondre plus précisément à votre question. Vous devez afficher votre table de boutons, etc dans la Vue, ce qui serait évidemment de mettre en œuvre un ActionListener. Dans votre
actionPerformed()
méthode permet de détecter l'événement et de l'envoyer à une méthode du contrôleur (rappelez - vous, la vue contient une référence à la manette). Alors, quand on clique sur un bouton, l'événement est détecté par la vue, envoyé à la méthode du contrôleur, le contrôleur peut demander directement à la vue de désactiver le bouton ou quelque chose. Ensuite, le contrôleur d'interagir avec et de modifier le modèle (qui pour la plupart ont getter et setter, et d'autres, d'enregistrer et notifier les observateurs et ainsi de suite). Dès que le modèle est modifié, il va appeler une mise à jour sur les observateurs inscrits (ce sera la vue dans votre cas). De là, la vue est mise à jour elle-même.=D
Je n'aime pas l'idée de la vue étant celui qui est notifié par le modèle lors de ses modifications de données. Je voudrais délégué de la fonctionnalité du contrôleur. Dans ce cas, si vous modifiez la logique de l'application, vous n'avez pas besoin de nuire à l'affichage de code. Le point de vue de la tâche est uniquement pour les applications de composants + mise en page, rien de plus rien de moins. Layouting dans swing est déjà une verbose la tâche, pourquoi laisser interférer avec les applications de la logique?
Mon idée de la MVC (dont je suis actuellement en train de travailler, so far so good) est :
Exemple De Code
La Vue :
Comme je l'ai dit, la création de la vue est déjà verbeux donc tout simplement créer votre propre mise en œuvre 🙂
Il est idéal pour l'interface les trois pour la testabilité fins. J'ai seulement donné mon de la mise en œuvre du Modèle et le Contrôleur.
Le Modèle :
Le Contrôleur :
La Main, où le MVC est de l'installation :
Le modèle MVC est un modèle de la façon dont une interface utilisateur peut être structuré.
Par conséquent, il définit les 3 éléments de Modèle, Vue, Contrôleur:
Exemple
Lorsque le
Button
est cliqué, il appelle laActionListener
. LeActionListener
ne dépend que d'autres modèles. Il utilise certains modèles comme il est d'entrée et d'autres comme c'est le résultat ou de sortie. C'est comme méthode d'arguments et valeurs de retour. Les modèles de notifier à l'interface utilisateur quand ils me mis à jour. Donc, il n'est pas nécessaire pour le contrôleur logique à savoir le composant de l'interface utilisateur. Le modèle d'objets ne connaissent pas l'interface utilisateur. La notification est faite par un observateur modèle. Ainsi, le modèle d'objets de savoir qu'il y a quelqu'un qui veut être notifié si le modèle change.En java swing il y a quelques composants qui implémentent un modèle et le contrôleur de bien. E. g. le javax.swing.Action. Il implémente une interface utilisateur modèle (propriétés: l'activation, la petite icône, le nom, etc.) et est un contrôleur parce qu'il s'étend ActionListener.
Un explication détaillée, exemples d'application et le code source: https://www.link-intersystems.com/blog/2013/07/20/the-mvc-pattern-implemented-with-java-swing/.
MVC notions de base en moins de 240 lignes:
Action
commeController
en fait, je suppose que tous lesEventListener
sont les contrôleurs..A controller encapsulates the application code that is executed in order to an user interaction
. Le déplacement de la souris, en cliquant sur un élément, appuyez sur une touche, etc. sont toutes les interactions de l'utilisateur. Pour rendre cela plus clair, j'ai mis à jour ma réponse.Vous pouvez créer de modèle dans un autre, simple classe Java, et un contrôleur à l'autre.
Puis vous pouvez avoir des composants Swing sur le dessus de cela.
JTable
serait l'un des points de vue (et de table modèle de facto être une partie de la vue - il ne ferait que traduire à partir du "modèle partagé" àJTable
).Chaque fois que le tableau est modifié, son modèle de table indique le "contrôleur" pour mettre à jour quelque chose. Toutefois, le contrôleur devrait ne sais rien à propos de la table. Donc, l'appel devrait ressembler à:
updateCustomer(customer, newValue)
, pasupdateCustomer(row, column, newValue)
.Ajouter un écouteur (observateur) interface pour le modèle partagé. Certains composants (par exemple, votre table) pourrait mettre en œuvre directement. Un autre observateur a pu être le contrôleur de bouton coordonnées de la disponibilité etc.
C'est une façon de le faire, mais bien sûr, vous pouvez simplifier ou de l'étendre si ses un overkill pour votre cas d'utilisation.
Vous pouvez fusionner le contrôleur avec le modèle et la même classe de processus de mises à jour et maintenir la disponibilité des composants. Vous pouvez même faire le "modèle partagé" un
TableModel
(si ce n'est pas seulement utilisé par la table, je recommande au moins un convivial API qui n'a pas de fuite de table abstractions)Sur l'autre main, vous pouvez avoir des interfaces complexes pour les mises à jour (
CustomerUpdateListener
,OrderItemListener
,OrderCancellationListener
) et contrôleur dédié (ou médiateur) uniquement pour la coordination de différents points de vue.Cela dépend de la complexité de votre problème.
Pour une bonne séparation, vous aurait généralement un contrôleur de classe que le Cadre de la classe délégué à. Il existe différentes façons de mettre en place les relations entre les classes - vous pu mettre en œuvre un contrôleur et de l'étendre avec votre affichage principal de la classe, ou d'utiliser un contrôleur autonome de la classe que le Cadre des appels lorsque des événements se produisent. Le point de vue généralement recevoir des événements de la manette par la mise en œuvre d'un auditeur de l'interface.
Parfois une ou plusieurs parties du modèle MVC sont triviales, ou alors "minces" qu'elle ajoute de la complexité inutile de les séparer. Si votre contrôleur est plein d'appels de ligne, l'avoir dans une classe à part peut affaiblir la sous-jacentes du comportement. Par exemple, si tous les événements en cours de traitement sont liées à un TableModel et sont simples d'ajouter et de supprimer des opérations vous pouvez choisir de mettre en œuvre l'ensemble de la manipulation de la table de fonctions à l'intérieur de ce modèle (ainsi que les rappels nécessaires pour l'afficher dans la JTable). Ce n'est pas vrai MVC, mais il évite l'ajout de la complexité là où il n'est pas nécessaire.
Toutefois la mettre en œuvre, n'oubliez pas de JavaDoc des classes, des méthodes et des paquets de sorte que les composants et leurs relations sont correctement décrits!
J'ai trouvé quelques articles intéressants sur la mise en œuvre de Motifs MVC, ce qui pourrait résoudre votre problème.
Si vous développez un programme avec un GUI, modèle mvc est presque là, mais floue.
Disecting modèle, vue et contrôleur de code est difficile, et, normalement, n'est pas seulement un refactoriser tâche.
Vous savez que vous avez lorsque votre code est réutilisable. Si vous avez correctement mis en œuvre MVC, devrait être facile à mettre en œuvre un TUI ou un CLI ou un RWD ou un premier mobile de la conception avec les mêmes fonctionnalités. Il est facile de voir qu'il fait que de le faire en fait, qui plus est sur un code existant.
En fait, les interactions entre le modèle, la vue et le contrôleur qui se passe à l'aide d'autres isolement des modèles (en qualité d'Observateur ou de l'Auditeur)
Je suppose que ce post explique cela en détail, de l directe non modèle MVC (comme vous pourrez le faire sur un Q&D) pour la finale réutilisables mise en œuvre:
http://www.austintek.com/mvc/