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é)
User
Interface Model Control Component
bypass
vue de la sémantique
qui est fournie pour
l’interface
• Modélise les régule les communications
interfaces jusque 1985 apparence de
entre l’application et l’interface l’interface et E/S
•optimisation
Pas de du séparation
feedback en composant utilisateur
logiques
etours visuels, dessins et implémentation
à main levée, etc)
modèle Arch - Slinky 1992
• Plus de couches
• Plus conceptuel régulation des tâches
séquencement de l’interaction
modèle•utilisateur
liés au modèle de tâches
Bien adapté pour la structure
versus modèle système fonctionnelle
adaptation aux toolkits de la plateforme visée
réorganisation des données Awt, Xvt, Swing, Views
Semantic enhancement
Contrôleur de Dialogue
Possibly adapted Domain Objects Logical Presentation Objects
transfert de
Adaptateur modifiable
structure de données
Présentation
• Functionnal Core Adapter portable • Logical Presentation Component
(Virtual Application Layer) explicites
(versus efficacité) (Virtual Toolkit)
représentation graphique
View
ouput devices
Model
input devices user
Controller
application semantics
noyau fonctionnel
gestion de l’interaction
en entrée
PAC 1987 (Joëlle Coutaz)
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 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();
JButton
JLabel
JButton
Modèle
JSlider
JSlider
découpage
Observer
Observable Update()
JButton Attach(Observer)
Notify()
JLabel
JButton
Modèle
setValeur(int) JSlider
getValeur()
valeur
JSlider
Exo1Model
import java.util.Observable;
valeur = x;
// notification des modifications dans la classe Observer
setChanged();
notifyObservers();
}
// setValue et getValue sont les accesseurs de JSlide pour récupérer/modifier la valeur du slider
model = mod;
// gestion d'évènements
addChangeListener( new ChangeListener() {
public void stateChanged(ChangeEvent chev) {
model.setValeur(getValue());
};
});
int base_value=0;
Exo1Model model=null;
// on construit le titre
String base_str = Integer.toString(bv);
if (bv > 0) base_str = "+"+base_str;
setText(base_str);
}
class Exo1Fenetre extends JFrame{
public Exo1Fenetre(){
// 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);
}
}