Architecture Logicielle pour les IHM

Slides:



Advertisements
Présentations similaires
Réaliser en Java un programme client d’une Base de Données
Advertisements

Conception d’IHM en Java
1 Swing par la pratique contrat Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique.
Data Management for Large-Scale Scientific Computations in High Performance Distributed Systems A. Choudhary, M. Kandemir, J. NoG. Memik, X. Shen, W. Liao,
Gestion des événements (suite)
Programmation événementielle
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Patrons Observateur/MVC programmation évènementielle
Arbres Un premier exemple Contenu Rendu Ecouteurs Parcours
Composants de Swing JavaBeans Actions Boutons Icônes Bordures Curseurs
Composants graphiques de Java
Diatelic - An Intelligent TeleSurveillance System for Peritoneal Dialysis Laurent Romary Minit Gupta Loria Labs, Nancy.
F. Voisin : Introduction à Java 1 Introduction à Java - les interfaces - Frédéric VOISIN FIIFO - « Remise à Niveau »
Voisin-Polian : Introduction à Java 1 Introduction à Java - AWT - Frédéric VOISIN – Nicole POLIAN FIIFO - « Remise à Niveau »
Les Interfaces graphiques Les Swing. Les interfaces graphiques: Introduction Une application est une boîte noire. Prend des entrées et produit des sorties.
Toolkit Web Framework Java pour les IHMs Cédric Dumas mars 2008 contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage.
TP2 ... MVC ? JList JLabel JSlider ImageLibrary Contrôleur Vue Modèle
Modèles d’architecture
contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage des Conditions Initiales à l'Identique.
Introduction aux IHM et à la réflexivité Java Vos premiers pas en Swing.
POO / IHM Architecture Logicielle
POO / IHM Architecture Logicielle
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Connexion base de données
Chapitre IV Object, interfaces, classes imbriquées.
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
IPA – Catherine Faron Zucke et Anne Marie Deryr. suite ordonnée d'éléments de taille variable ArrayList liste; liste = new ArrayList (); Ne peuvent contenir.
TM.
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Cours VHDL Chap 3: sémantique VHDL
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
1 1 Université Evry Val d'Essonne Y. Laborde Une calculatrice (sans MVC) fonctionnant sur la base d'un modèle en Java.
Réalisée par :Samira RAHALI
Java : Modèle / Vues / Contrôleurs
Master 1 SIGLIS java Lecteur Stéphane Tallard Chapitre 4 – Structures de contrôle.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Interface graphiques.
Le patron de conception « Strategy » Simon Durocher ( )
Programmation par Objets et Java
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
5.1 URDL22005 Systèmes dexploitation Threads Vue dEnsemble Modèles de Multithreading Problèmes des Threads Pthreads Threads Windows XP Threads Linux Threads.
Laboratoire de Bioinformatique des Génomes et des Réseaux Université Libre de Bruxelles, Belgique Introduction Statistics.
JUnit Présentation complète de JUnit et « guide d’utilisation » en 13 transparents.
1. Les structures de documentation pour la division ST. 2. Les types de document dans la division ST. 3. Linterface informatique. Lundi 8 Mai 2000 ST Quality.
Introduction au paradigme orienté-objet (suite)
Design Pattern Memento. Principe : Enregistrer les changements d'états d'un objet Objectif : Pouvoir restituer les états précédents d'un objet.
Multi-Thread Jian-Yun Nie
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
I.S.I.S. Information System Initial Specification Rétro-conception de Bases de données Cyr Gabin Bassolet TIMC – équipe OSIRIS 21 décembre 2004.
Badr Benmammar Formation Développeur Java Thread et Swing Badr Benmammar
Java Swing.
Cours 2 : Patrons Observateur/MVC programmation évènementielle
Fabienne Boyer Laboratoire LIG (INRIA-UJF-INPG) Projet SARDES, INRIA Rhône-Alpes APACHE/VELOCITY.
Structures de données IFT-10541
Patrons de conceptions de créations
Branche Développement Le présent document contient des informations qui sont la propriété de France Télécom. L'acceptation de ce document par son destinataire.
Java : Graphique Swing juin 2006 Brigitte Groléas.
Objectifs À la fin de ce cours, vous serez capables de :
Propriétés. Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation.
Cours 7 Classes locales Clonage Divers: tableaux.
Le contenu est basé aux transparents du 7 ème édition de «Software Engineering» de Ian Sommerville«Software Engineering» de Ian Sommerville B.Shishedjiev.
Interfaces graphiques. Composants d'interface utilisateur graphique (GUI) 1 Bibliothèques Awt et Swing Procédures communes pour l'utilisation de ces clases.
14 La gestion d’événements
« Validation Formelle de Systèmes Interactifs »
Interfaces Graphiques
 1) Il faut connaître le modèle et son fonctionnement  2) Définir le contrôle que l’on veut faire ouvrir, fermer, afficher, etc.) sur le modèle  3)
IHM Modèle d’architecture et liens avec les outils de production d’interface IHM Dirrigé par : Catherine RECANATI Présenté par : Youssef OUDGHIRI YOUSFI.
Java Swing. Principes de base  Des composants graphiques (exemple: JFrame, JButton …)  Hiérarchie de classes  Des événements et les actions à effectuer.
Transcription de la présentation:

Architecture Logicielle pour les IHM C. Dumas Cedric.Dumas@emn.fr contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage des Conditions Initiales à l'Identique 2.0 France License

Introduction Constat Conception d’IHM : difficile, donc nécessairement itérative Itérativité implique modifiabilité du logiciel Savoir-faire artisanal : acceptable pour maquettes, systèmes prospectifs (pas de besoin liés à la mise en production) Complexité et taille croissantes des IHM collecticiels, multimodalités, RV, RA, Universal Access, etc... Outils de développement des IHM : utiles mais imparfaits boîtes à outils : niveau d’abstraction trop bas, absence de structuration squelettes d’applications : rétro-conception (reverse engineering) nécessaire pour réutiliser générateurs d’IHM : le syndrôme de l’ABS (faux sentiment de sécurité) Conséquence : besoin de cadre de pensée, c.-à-d. de modèles d’architecture

Architecture Conceptuelle Sert à la (retro)conception

Architecture Logicielle IEEE 1471 standard (2000) « The fundamental organization of a system embodied in its components, their relationships to each other and to the environment, and the principles guiding its design and evolution » Autrement dit : Une architecture : ensemble organisé de composants + des relations + des principes directeurs Une architecture est le résutat d’un processus L’environnement : participants (culture en qualité logicielle, outils, requis commercial… Finalité d’une architecture communication (précision et non ambiguïté de la description) rétro-conception d’un système existant évaluation (selon des critères qualité) Dictinction entre architecture et description d’architecture Maier (2001) « architecture is a concept of a system » Une architecture est un concept d’un système : elle existe bien que non observable Une description d’architecture : représentation de ce concept pour une finalité donnée. C’est une entité concrète.

Architecture Logicielle Bass (1998) « The architecture of a computing system is a set of structures which comprise software components, the externally visible properties of these components and the relationships among them » Autrement dit : Plusieurs points de vue sur une architecture (cf.Architecture en bâtiment) Un point de vue : une structure, sa représentation pour une finalité donnée Propriétés d’un composant : description du comportement attendu Services fournis ou requis,Performance,Protocole de communication Propriétés observables de l’extérieur : un composant est une unité d’abstraction, une unité de déploiement un service, un module, un bibliothèque, un processus, un procédure, un objet, un agent, etc., sont des composants Relations -> connexion -> connecteurs (appel procédural, RMI, socket, etc.) Connecteur Composant Composant

Architecture Conceptuelle Sert à la (retro)conception

Architecture Conceptuelle Sert à la (retro)conception Séparation entre la sémantique et son utilisation portabilité (device independant) réutilisabilité plusieurs interfaces (flexibilité, plateformes, etc) personnalisation(designer, utilisateur) Communication entre l’application et la présentation : contrôleur de dialogue 3 composants maintenant...

le modèle de Seeheim 1985 Modélise les interfaces jusque 1985 (niveau sémantique) (niveau syntaxique) (niveau lexical) Application Interface Model Dialog Control Presentation Component Application User User vue de la sémantique qui est fournie pour l’interface bypass régule les communications entre l’application et l’interface apparence de l’interface et E/S utilisateur optimisation du feedback (retours visuels, dessins à main levée, etc) Modélise les interfaces jusque 1985 Pas de séparation en composant logiques et implémentation

modèle Arch - Slinky 1992 Plus de couches Plus conceptuel Bien adapté pour la structure fonctionnelle régulation des tâches séquencement de l’interaction liés au modèle de tâches modèle utilisateur versus modèle système réorganisation des données Semantic enhancement adaptation aux toolkits de la plateforme visée Awt, Xvt, Swing, Views Contrôleur de Dialogue Possibly adapted Domain Objects Logical Presentation Objects transfert de structure de données explicites Adaptateur Functionnal Core Adapter (Virtual Application Layer) Présentation Logical Presentation Component (Virtual Toolkit) modifiable portable (versus efficacité) Domain Objects Physical Interaction Objects presentation widgets look and feel Interaction Interaction Toolkit Component Physical Presentation Component Domaine Application Functionnal Core Domain-specific component application noyau fonctionnel

Agent Based Models Modèles basés sur des agents Système interactif = ensemble d’unités computationelles (agents) Agent capacité à réagir et à gérer des événements caractérisé par un état possède une capacité d’expertise (rôle) relation utilisateur interacteur / objet d’interactif Système interactif = agents réactifs (<> agents cognitifs) MVC, PAC, Clock, C2, etc... Modèle même principe que les précédents, avec une granularité plus fine (par collections)

modèle MVC 1987 (Smalltalk) représentation graphique ouput devices input devices user View Model application semantics noyau fonctionnel Controller gestion de l’interaction en entrée

PAC 1987 (Joëlle Coutaz) Presentation combine Input/Output (MVC) Control pilote le dialogue et la cohérence entre le modèle et sa représentation (MVC) Communication entre agents (MVC) Pas lié à un environnement de programmation (MVC), approche objet tout de même Plus conceptuel encore (moins dépendant de l’implémentation) que MVC Abstraction Presentation Control

MVC en Java ? JTextField (textField) JTextArea (textList) +JScrollPane textField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Append the textField's text to textList textList.append(textField.getText()); textList.append("\n"); textField.setText(""); // Reset the textField } }); // ENTER key causes an ActionEvent

MVC en Swing JTextField (textField) JTextArea (textList) JTextArea (avgField) solutions ? listener textField vers avgField listener textList vers avgField listener contenant la mise à jour des deux éléments textList et avgField MVC dans tout ça ? où est le modèle ?

MVC rules

listView public class ListView extends JTextArea { public ListView(int n) { ... } public void changed (Vector v) { // copie du vector dans le JTextArea } }

IntVectorModel public void addElement(int i) public class IntVectorModel { protected Vector data = new Vector(); // gestion de la liste (addElement, getData, etc...) public void addElement(int i) { data.addElement(new Integer(i)); fireChange(); } public Vector getData() { return data; }

public class IntVectorModel { ... protected EventListenerList changeListeners = new EventListenerList(); // gestion des événements public void addChangeListener(ChangeListener x) { ... } public void removeChangeListener(ChangeListener x) {...} protected void fireChange() { // Create the event: ChangeEvent c = new ChangeEvent(this); // Get the listener list Object[] listeners = changeListeners.getListenerList(); // Process the listeners last to first for (int i = listeners.length...) { ... listeners[j].stateChanged(c); ... } }

IntVectorToListviewAdaptor private static class IntVectorToListviewAdaptor implements ChangeListener { IntVectorModel model; ListView view; public IntVectorToListviewAdaptor( IntVectorModel m, ListView v) { model = m; view = v; } public void stateChanged(ChangeEvent e) { view.changed(model.getData()); } }

La fenêtre principale public class FirstMVC extends JFrame { [...] ListView listView = new ListView(5); // vue TextField avgView = new TextField(10); // vue IntVectorModel model = new IntVectorModel(); // modèle TextField controller = new TextField(10); // contr. dans le constructeur FirstMVC() ... IntVectorToListviewAdaptor MV2 = new IntVectorToListviewAdaptor(model,listView); model.addChangeListener(MV2);

et dans le constructeur... JPanel controlPanel = new JPanel(); controlPanel.add(controller); JPanel viewPanel = new JPanel(); viewPanel.add(avgView); viewPanel.add(ListView);

MVC en Java Modèle de façon générale : Observer/Observable dans java.util MVC dans Swing : JComponent = model + delegate delegate = V + C

Observer Design Pattern One to many

Premiers éléments de réponse à la question 1

Découpage de la question 1 2 vues JLabel JSlider 7 contrôleurs 6 JButtons 1 modèle Gestion d’un entier

découpage JButton JLabel JButton Modèle JSlider JSlider

découpage Observer Observable JButton JLabel JButton Modèle JSlider Update() Observable Attach(Observer) Notify() JButton JLabel JButton Modèle setValeur(int) getValeur() valeur JSlider JSlider

Exo1Model import java.util.Observable; public class Exo1Model extends Observable { public int valeur=0; static int MIN_VALUE=0; static int MAX_VALUE=999; public Exo1Model() { valeur = 0; } public void setValeur(int x) { if (x < MIN_VALUE) x=MIN_VALUE; if (x > MAX_VALUE) x=MAX_VALUE; valeur = x; // notification des modifications dans la classe Observer setChanged(); notifyObservers(); } public int getValeur() { return valeur; }

JLabel (vue 1) public class Exo1Vue extends JLabel implements Observer { public Exo1Vue(String text) { super(text); } public void setVue(int text){ setText(String.valueOf(text)); public void update(Observable obs,Object obj) { Exo1Model mod = (Exo1Model) obs; // prendre la bonne habitude de tester la compatibilité des types if (obs instanceof Exo1Model) setVue(mod.getValeur());

JSlider (vue 2) public class Exo1ControllerSlider extends JSlider implements Observer { // setValue et getValue sont les accesseurs de JSlide pour récupérer/modifier la valeur du slider Exo1Model model = null; public Exo1ControllerSlider(Exo1Model mod) { model = mod; // initialisation des valeurs du slide […] // gestion d'évènements addChangeListener( new ChangeListener() { public void stateChanged(ChangeEvent chev) { model.setValeur(getValue()); }; }); } public void update(Observable obs,Object obj) { Exo1Model mod = (Exo1Model) obs; // prendre la bonne habitude de tester la compatibilité des types if (obs instanceof Exo1Model) setValue(mod.getValeur());

JButton (controlleur 1) public class Exo1ControllerBoutons extends JButton { int base_value=0; Exo1Model model=null; void setBase(int i) { base_value=i; } int getBase() { return base_value; } public Exo1ControllerBoutons(Exo1Model mod,int bv) { model=mod; // base_value contient le pas de l'incrément des boutons setBase(bv); // on construit le titre String base_str = Integer.toString(bv); if (bv > 0) base_str = "+"+base_str; setText(base_str); addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { model.incremente(base_value); } });

class Exo1Fenetre extends JFrame{ Exo1Model model = new Exo1Model(); public Exo1Fenetre(){ setTitle("TP MVC - Exo1"); JPanel p = new JPanel(); p.setLayout(new BorderLayout()); getContentPane().add(p); // initialisation des boutons JPanel q = new JPanel(); q.setLayout(new GridLayout (3,2)); p.add(q,BorderLayout.WEST); // boutons des unités Exo1ControllerBoutons cb; cb = new Exo1ControllerBoutons(model,1); q.add(cb); […] // initialisation de la vue Exo1Vue vue = new Exo1Vue("0"); p.add(vue,BorderLayout.CENTER); // intialisation du slider Exo1ControllerSlider cslider = new Exo1ControllerSlider(model); p.add(cslider,BorderLayout.EAST); // ajout des connections entre le modèle et les vues pour que ces dernières soient mises à jour model.addObserver(cslider); model.addObserver(vue); }