TP : Mise en oeuvre de MVC



Documents pareils
Développement Logiciel

Interfaces graphiques avec l API Swing

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Projet de programmation (IK3) : TP n 1 Correction

Création d un service web avec NetBeans 5.5 et SJAS 9

Un ordonnanceur stupide

Auto-évaluation Programmation en Java

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Construire des plug-ins pour SAS Management Console SAS 9.1

Programmer en JAVA. par Tama

TP1 : Initiation à Java et Eclipse

Synchro et Threads Java TM

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Introduction au langage Java

Design patterns. Design patterns - définition. Design patterns - avantages

Corrigé des exercices sur les références

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Le langage JAVA G. Baulieu Institut de Physique Nucléaire de Lyon Septembre 2009

Premiers Pas en Programmation Objet : les Classes et les Objets

Desktop Intégration. Rémi Forax

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

INITIATION AU LANGAGE JAVA

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Bases Java - Eclipse / Netbeans

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Programmation Par Objets

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Introduction aux composants logiciels : JavaBeans Master des Technologies de l'internet

Environnements de développement (intégrés)

Par Laurent DESECHALLIERS. Mastère Spécialisé en Management de Projets en Milieu Industriel. CESI de Rouen Promotion 2002/2003.

Java 7 Les fondamentaux du langage Java

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

as Architecture des Systèmes d Information

Cours 1: Java et les objets

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

TD/TP PAC - Programmation n 3

Threads. Threads. USTL routier 1

Applet pour visualiser les variables «automate» notifiées

Package Java.util Classe générique

Remote Method Invocation (RMI)

Une introduction à la technologie EJB (2/3)

RMI le langage Java XII-1 JMF

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Remote Method Invocation Les classes implémentant Serializable

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

Calcul Parallèle. Cours 5 - JAVA RMI

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

La Programmation Orientée Agent Les Agents Réactifs

TD/TP PAC - Programmation n 3

Programmation avec des objets : Cours 7. Menu du jour

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Tp 1 correction. Structures de données (IF2)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Création d une application JEE

Dis papa, c est quoi un bus logiciel réparti?

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

LOG4430 : Architecture logicielle et conception avancée

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Objets et Programmation. origine des langages orientés-objet

Introduction : les processus. Introduction : les threads. Plan

Programmation Orientée Objet

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Remote Method Invocation en Java (RMI)

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Une architecture, pourquoi faire? Architecture Logicielle des IHM. IHM et architecture. Découpage par Abstraction

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Programmation par les Objets en Java

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Classe Interne, Anonyme & Enumération

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Les frameworks au coeur des applications web

Initiation à JAVA et à la programmation objet.

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Programmation Objet Java Correction

Logiciel de gestion de caisse et d ardoises

BIRT (Business Intelligence and Reporting Tools)

Tutoriel d installation de Hibernate avec Eclipse

SugarCubes. Jean-Ferdinand Susini Maître de Conférences, CNAM Chaire systèmes enfouis et embarqués. Paris, le 9 janvier, 2009

Cours 2 : programmation des interfaces graphiques

Modèle à composants. Daniel Hagimont. IRIT/ENSEEIHT 2 rue Charles Camichel - BP TOULOUSE CEDEX 7. Remerciements

Programme Compte bancaire (code)

Chapitre 10. Les interfaces Comparable et Comparator 1

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Programmation en Java IUT GEII (MC-II1) 1

Solutions du chapitre 4

Transcription:

Université de Lille 1 - Master 1 informatique 2012-2013 IHM TP : Mise en oeuvre de MVC Objectifs se familiariser avec les patrons de conception observateur et stratégie, se familiariser avec la conception d une application suivant le modèle MVC 1 Illustration de la mise en oeuvre de MVC 1.1 Objectif L objectif est de créer une interface permettant le contrôle de la température en degrés Celsius ou Farenheit. L interface se compose de trois vues représentant la même température sous des formes différentes. La modification d une des vues doit mettre automatiquement à jour les autres vues. Nous allons voir comment appliquer le modèle MVC pour réaliser cette interface. Le code de l application est disponible ici 1. Figure 1 L interface de contrôle de température. Les trois vues représentent un même modèle. La modification d une vue met automatiquement à jour les autres vues. 1.2 Préambule Figure 2 Le modèle MVC. 1. TPtemperature.zip 1

Le MVC (Model View Controller), Modèle, Vue, Contrôleur comprend : 1. Un modèle. Celui-ci comprend les données et un certain nombre de méthodes pour les lire et les modifier. Le modèle n a aucune connaissance de la façon dont les données sont présentées à l utilisateur (la Vue). Le modèle peut toutefois enregistrer une ou plusieurs vues (une liste de dépendants) qui sont notifiées quand les données du modèle ont subi une modification (patron de conception Observateur). En Java, le modèle comprend une ou plusieurs classes qui dérivent de la classe java.util.observable 2 (ou d une interface ou classe équivalente). 2. Une ou plusieurs vues. Une vue fournit une représentation graphique de tout ou partie des données du modèle. Chaque vue obtient les données à afficher en en faisant la demande au modèle. Quand un utilisateur manipule une vue d un modèle, la vue informe le contrôleur du changement désiré. En Java, les vues sont construites à base de composants Swing. Les vues doivent cependant implémenter l interface java.util.observer 3 (ou interface équivalente). 3. Plusieurs contrôleurs. Les vues sont associées à des contrôleurs qui mettent à jour le modèle. Chaque vue est associée à un unique contrôleur. Le contrôleur interprète les actions de l utilisateur (par exemple augmenter la température) et appelle les méthodes requises du modèle pour le mettre à jour. Le modèle informe alors toutes les vues qu un changement est intervenu. Ces dernières se mettent à jour. Il peut aussi vérifier les actions de l utilisateur et modifier la vue en conséquence si besoin. 1.3 Le modèle Le modèle dérive de la classe java.util.observable. La classe doit définir les accesseurs et les mutateurs pour obtenir et modifier l état courant du modèle. Chaque mutateur doit appeler la méthode setchanged() et notifyobservers() après avoir modifié les données du modèle. notifyobservers va notifier chaque vue qu un changement d état du modèle a eu lieu. notifyobservers permet également de passer des informations supplémentaires concernant le changement d état (variante push du patron de conception Observateur). Voici la classe du modèle correspondant à notre interface : public class TemperatureModel extends Observable { private double temperaturec = 20; public double getc (){ return temperaturec ; public void setc ( double tempc ){ temperaturec = tempc ; setchanged (); notifyobservers (); public double getf (){ return temperaturec * 9. 0/ 5. 0 + 32.0; public void setf ( double tempf ){ temperaturec = ( tempf - 32) * 5.0 / 9.0; setchanged (); notifyobservers (); 1.4 Les vues Il est maintenant possible de créer une ou plusieurs vues. Chaque vue doit implémenter l interface java.util.observer et par conséquent implémenter la méthode update. Le premier paramètre permet 2. http://java.sun.com/j2se/1.4.2/docs/api/java/util/observable.html 3. http://java.sun.com/j2se/1.4.2/docs/api/java/util/observer.html 2

d identifier le sujet à l origine de la mise à jour et le second permet de recevoir des informations supplémentaires concernant la mise à jour. Une vue peut éventuellement avoir plusieurs modèles. Chaque vue a besoin de connaître le modèle et le contrôleur. La connaissance du modèle permet d enregistrer la vue auprès de ce dernier et d appeler les méthodes du modèle pour mettre à jour la vue. Les actions de l utilisateur sur l interface sont envoyées au contrôleur. Comme nous avons deux vues très semblables, nous définissons la classe abstraite suivante : public abstract class TemperatureVue implements Observer { private String label ; protected TemperatureModel model ; protected TemperatureController controller ; private JFrame temperaturejframe ; private JTextField display = new JTextField (); private JButton upjbutton = new JButton (" +"); private JButton downjbutton = new JButton ("-"); le modele TemperatureVue ( String label, TemperatureModel model, TemperatureController controller, int posx, int posy ) { this. label = label ; this. model = model ; this. controller = controller ; temperaturejframe = new JFrame ( label ); temperaturejframe. add ( new JLabel ( label ), BorderLayout. NORTH ); temperaturejframe. add ( display, BorderLayout. CENTER ); JPanel panelbuttons = new JPanel (); panelbuttons. add ( downjbutton ); panelbuttons. add ( upjbutton ); temperaturejframe. add ( panelbuttons, BorderLayout. SOUTH ); temperaturejframe. setdefaultcloseoperation ( JFrame. EXIT_ ON_ CLOSE ); model. addobserver ( this ); // Connexion entre la vue et temperaturejframe. setsize (200,100); temperaturejframe. setlocation ( posx, posy ); temperaturejframe. setvisible ( true ); public void setdisplay ( String s) { display. settext (s); public void enablewarningcolor () { display. setbackground ( Color. RED ); public void disablewarningcolor () { display. setbackground ( Color. WHITE ); public double getdisplay () { double result = 0.0; try { result = Double. valueof ( display. gettext ()). doublevalue (); catch ( NumberFormatException e ){ return result ; public void adddisplaylistener ( ActionListener a){ display. addactionlistener ( a ); public void adduplistener ( ActionListener a){ upjbutton. addactionlistener ( a ); public void adddownlistener ( ActionListener a){ downjbutton. addactionlistener ( a ); protected TemperatureModel model (){ return model ; 3

La classe TemperatureVueCelsuis dérive de TemperatureVue et implémente la méthode update : public class TemperatureVueCelsuis extends TemperatureVue { public TemperatureVueCelsuis ( TemperatureModel modele, TemperatureController controleur, int posx, int posy ) { super (" Temperature Celsuis ",modele, controleur, posx, posy ); setdisplay (""+ model. getc ()); adduplistener ( new ActionListener () { public void actionperformed ( ActionEvent e) { controller. augmentedegresc (); ); adddownlistener ( new ActionListener () { public void actionperformed ( ActionEvent e) { controller. diminuedegresc (); ); adddisplaylistener ( new ActionListener () { public void actionperformed ( ActionEvent e) { double tempc = getdisplay (); controller. fixedegresc ( tempc ); ); public void update ( Observable s, Object o) { setdisplay (""+ model (). getc ()); Les autres vues sont définies de manière similaire. 1.5 Les contrôleurs Chaque vue est associée à un unique contrôleur. Le contrôleur interprète les actions de l utilisateur et met à jour le modèle. Le contrôleur peut utiliser le patron de conception stratégie pour mettre en oeuvre différentes stratégies d interprétation des actions de l utilisateur. Dans l exemple ci-dessous, nous pouvons augmenter la température d un degré quand on clique sur le bouton + mais il doit être possible de modifier la façon dont la température augmente ou diminue sans avoir à réécrire complètement la classe TemperatureController. Enfin, le contrôleur doit également avoir connaissance de la vue qui lui est associée pour éventuellement modifier cette dernière. En effet des actions de l utilisateur sur la vue peuvent avoir pour conséquence de modifier la vue sans pour autant modifier le modèle. Cela se fait par un appel de méthode de la vue. Dans l exemple ci-dessous, nous faisons passer le champ de texte en rouge quand la température dépasse 40C par un appel dans la méthode control de la méthode enablewarningcolor() définie dans la vue. On pourrait de la même façon ajouter un bouton qui, quand on clique dessus sur la vue, modifie par exemple la couleur de l arrière plan de l interface. Le contrôleur pourrait aussi vérifier que le texte saisi par l utilisateur dans les champs de texte correspond bien à un nombre et, le cas échéant, informer la vue qu une erreur de saisie a eu lieu. interface ModifieTemperature { public double augmentedegres ( double temp ); public double diminuedegres ( double temp ); class ModifieTemperaturePlus1 implements ModifieTemperature { public double augmentedegres ( double temp ) { return temp + 1; public double diminuedegres ( double temp ) { return temp - 1; 4

public class TemperatureController { private TemperatureModel model ; private TemperatureVue view = null ; private ModifieTemperature modtemp = new ModifieTemperaturePlus1 (); public TemperatureController ( TemperatureModel m) { model = m; public void augmentedegresc (){ model. setc ( modtemp. augmentedegres ( model. getc ())); public void diminuedegresc (){ model. setc ( modtemp. diminuedegres ( model. getc ())); public void fixedegresc ( double tempc ){ model. setc ( tempc ); public void augmentedegresf (){ model. setf ( modtemp. augmentedegres ( model. getf ())); public void diminuedegresf (){ model. setf ( modtemp. diminuedegres ( model. getf ())); public void fixedegresf ( double tempf ){ model. setf ( tempf ); public void control () { if ( view!= null ) { if ( model. getc () > 40.0) { view. enablewarningcolor (); else { view. disablewarningcolor (); public void addview ( TemperatureVue view ) { this. view = view ; 1.6 Intégration du tout public class TemperatureMVC { public TemperatureMVC () { TemperatureModel tempmod = new TemperatureModel (); TemperatureController tempcontrolc = new TemperatureController ( tempmod ); TemperatureController tempcontrolf = new TemperatureController ( tempmod ); TemperatureVueCelsuis pvc = new 5

TemperatureVueCelsuis ( tempmod, tempcontrolc, 100, 200); TemperatureVueFarenheit tvf = new TemperatureVueFarenheit ( tempmod, tempcontrolf, 100, 350); tempcontrolc. addview ( pvc ); tempcontrolf. addview ( tvf ); Question 1. public static void main ( String args []) { //Schedule a job for the event-dispatching thread: //creating and showing this application s GUI. javax. swing. SwingUtilities. invokelater ( new Runnable () { public void run () { new TemperatureMVC (); ); Ajoutez la vue sous forme de thermomètre (voir figure 1) en utilisant la classe JSlider. La modification de cette vue doit bien sûr modifier automatiquement les autres vues. Remarque : Il est fortement déconseillé de faire hériter cette vue de la classe abstraite TemperatureVue. 2 Mise en application Question 2. Reprenez l exercice sur le sélecteur de couleur et appliquez le modèle MVC en vous inspirant de l exemple précédent. Question 3. Modifiez les contrôleurs nécessaires pour afficher un retour visuel sur la vue correspondante quand une valeur erronée a été entrée par l utilisateur (par exemple, une valeur en dehors de la plage 0-255 ou une valeur non numérique rentrée pour les représentations décimales de la couleur). Ce retour visuel peut, par exemple, prendre la forme d un changement de la couleur d arrière plan du champ de texte ou alors se présenter sous forme de popup. Figure 3 Sélecteur de couleur. 6