Title: DEUG MIAS Option Info Introduction JAVA
1DEUG MIAS Option Info Introduction à JAVA
- Olivier Sigaud
- LIP6/AnimatLab
- olivier.sigaud_at_lip6.fr
- 01.44.27.88.53
2Plan du cours 7 Interfaces graphiques en JAVA
- Le modèle MVC
- Programmation par événements
- Applet et Application
- Evolutions des modèles de sécurité
- AWT et Swing
- Présentation générale de Swing
- Coder une application Swing
3- Le modèle MVC (pour Model, View, Controller)
Utilisateur
voit
utilise
View
Controller
manipule
rafraîchit
Model
Application
4- Model le cur de lapplication (état et
données). - S'il y a un changement dans le modèle,
- celui-ci rafraîchit TOUTES ses vues (View).
- Controller linterface en entrée présentée à
lutilisateur pour manipuler lapplication. - View linterface en sortie présentée à
lutilisateur pour représenter des données du
Modèle.
5- MVC design pattern issu de Smalltalk-80
- Peut servir à autre chose quaux interfaces
graphiques. - Exemples log, interactions entre applications
distantes, réflexes - Tout objet ayant besoin dinformations sur les
changements du Modèle doit être une Vue
répertoriée auprès du modèle (registered view). - Toute la gestion des événements en java est basée
sur un concept MVC .
6Programmation par événements
- Un modèle de programmation MVC où les échanges
entre Modèle, View et Controleur seffectuent
sous forme dévénements. - Adapté aux IHM quand le programme veut savoir
ce que fait l'utilisateur - Deux méthodes dattentes dévénements
- boucle programmeur ou boucle système
7Avant Le polling
- Quand le programme doit activement collecter les
informations sur ce que fait l'utilisateur. - En Pratique après initialisation, on regarde si
l'utilisateur a fait quelque chose (1) - lecture ACTIVE de létat des boutons, des cases à
cocher, des curseurs. - On fait ce quil y a à faire.
- Et. On reboucle en (1)
8Inconvénients
- Le polling marche, mais
- 1) tout le code de gestion des événements est au
même endroit (dans la boucle). - 2) tendance à complexifier le traitement des
événements - 3) la boucle tourne tout le temps et consomme des
cycles CPU - Pour éviter certains de ces problèmes
Programmation par événements
9Caractéristiques
- Actions abstraites de l'utilisateur sous forme
d'événements qui décrivent avec suffisamment de
détails les actions de l'utilisateur. - Un processus système se charge de produire des
événements destinés à lutilisateur.
10Deux méthodes dattentes dévénements
fonction bloquante unique(dans une boucle
programmeur) ou diffusion par le
système(protocole)
11Les Applets
12Applet et Application
- Applet petite application téléchargée dans un
navigateur web. - Héritée de la classe Applet (ou JApplet cf.
loin) - Bénéficie dun contexte graphique déjà créé
- Contexte dexécution protégé (SandBox contrôle
daccès) - Quatre méthodes principales init(), start(),
stop(), destroy() - Application ensemble autonome de classes,
exécutables sur une VM (Virtual Machine).
13La classe Applet
- public class Applet extends java.awt.Panel
-
- public void start()
- public void stop()
- public void init()
- public boolean isActive()
-
-
- Il existe une classe JApplet en SWING
14Installer une Applet
- Disposer dun fichier HTML dans lequel est placée
une balise permettant de mettre lapplet sur la
page web - Lapplet démarre quand on consulte la page web
- Possibilité de passer des paramètres
15Exemple de fichier HTML
- ltHEADgtlt/HEADgt
- ltBODYgt
-
- ltAPP classTetris x10 y20gt
- ltAPPLET codebase classes/beta
code Tetris.class width120 height250gt - ltPARAM namex value10gt
- ltPARAM namex value10gt
- lt/APPLETgt
-
- lt/BODYgt
- Seule la partie en bleu est obligatoire
16Sécurité
17Java et sécurité Evolutions
- Modèle de sécurité du JDK 1.0
- Liberté totale daccès pour le code local
(application) - Restriction totale pour le code téléchargé
- Un gestionnaire de sécurité contrôle le tout.
18Modèle de sécurité du JDK 1.1
- Applet signée code considéré comme du code
local. - Applets non trustées continuent dêtre
exécutées dans le bac à sable - Applets signées signatures respectives livrées
sous forme de fichiers JAR signés (Java Archive)
19JDK 1.2 (et 1.3, 1.4)
- Tout code (local ou distant) peut être soumis à
contrôle daccès. - Des Domaines regroupent des classes ayant les
mêmes droits sur les mêmes ressources. - Un Domaine peut être configuré comme sandBox
- Les applications ne sont pas restreintes par
défaut. - Permet une gradation de permissions daccès
depuis laccès total à la restriction totale.
20Swing
21AWT et Swing
- Abstract Window Toolkit jdk1.0, jdk1.1
- premier jet
- basé sur des composants du système hôte.
- composants lourds
- Swing léger et tout en java !
- pas de code natif
- beaucoup plus puissant
22Filiation suivant 2 critères traitement des
actions utilisateur et structure
Programmation événementielle
Polling
Gestion à la main
Xlib, OpenGL
Java AWT 1.0
Objets événements
Java AWT 1.1
Modèle par délégation
Java Swing
Composants pur Java
23Présentation générale de Swing
Une des formes les plus abouties denvironnement
de création dIHM..
24Un environnement graphique
- Simple, léger, riche, puissant
- Hiérarchie de constituants interchangeables
- Agencement souple LayoutManagers
- Gestion élégante des événements
- Painting clair et hiérarchisé
25Conteneurs de premier niveau
Conteneurs généraux
26Conteneurs spécialisés
27Contrôles de base
Frame
28Afficheurs non éditables
29Editeurs dinformations structurées ou formatées
Tree
Table
Text
30- Hiérarchie de constituants
- Gestion souple de lagencement
Layout managers
31- Gestion des événements
- un click, un caractère, un bouton enfoncé --gt un
événement. - nimporte quel objet peut être notifié de cet
événement. Il doit juste implémenter la bonne
interface. - Painting clair et hiérarchisé
- du composant le plus haut dans la hiérarchie vers
le plus bas. - du background vers le foreground
- quand le système le décide
- déboggable à cur
32Marche à suivre
33Coder une application Swing
- 1) Importer les packages swing.
- 2) Construire une (ou plusieurs) fenêtre(s) de
haut niveau. - 3) Créer des boutons et Labels
- 4) Ajouter des composants aux Containers
- 5) Gérer des événements
- - Comment peindre dans un JPanel ?
341. Importer les packages swing.
- import javax.swing.
- Note les premiers JFC/Swing et des releases
béta de JDK 1.2 ont utilisé des noms de package
différents (com.sun. ). - La plupart des programmes ont aussi besoin
dimporter les deux packages principaux de lAWT
(Abstract Window Toolkit). - import java.awt.
- import java.awt.event.
352. Construire une (ou plusieurs) fenêtre(s) de
haut niveau.
- Tout programme ayant une interface Swing comporte
au moins un top-level Swing container (JFrame,
JDialog, ou, pour les applets, JApplet). - Un top-level Swing container procure
lenvironnement dont les composants Swing ont
besoin pour se dessiner et gérer les événements.
36Petit exemple simple
- public class SwingApplication ...
- public static void main(String args
... - JFrame frame new
JFrame("SwingApplication") - //création des composants
internes au frame - // qui seront mis dans un
container nommé contenu ... - frame.getContentPane().add(cont
enu, BorderLayout.CENTER) - // ajout dun listener
dévénements de type fenêtre
frame.addWindowListener(...) - // retaillage et calcul définitif des
dimensions internes - frame.pack()
- // affichage de lapplication
- frame.setVisible(true)
- // fin de la méthode main
- // fin de la classe SwingApplication
37 3. Créer des boutons et Labels
- Exemple de code typique de création de bouton
- JButton button new JButton( Je suis un
bouton ) - button.addActionListener(un ActionListener ..
.) - La première ligne crée le bouton.
- La deuxième enregistre un gestionnaire
dévénements pour ce bouton - voir plus loin Gestion des événements
384. Ajouts des composants aux Containers
- Les applications Swing groupent les boutons et
autres composants dans des containers (JPanel)
avant de les insérer dans le JFrame. - On peut positionner un gestionnaire
dagencement (ou Layout manager) dans le JPanel
pour contraindre la disposition des composants
quil contient. - Exemples
39Exemple de code de création et dinitialisation
dun JPanel
- // création du JPanel
- JPanel jPanel new JPanel()
- // une petite bordure pour faire joli.
- jPanel.setBorder(BorderFactory.createEmptyBorder(3
0, 30, 10, 30)) - // un Layout manager qui aligne de gauche à
droite les composants - jPanel.setLayout(new FlowLayout())
- // on insère le bouton et un label
- jPanel.add(button)
- jPanel.add(label)
405. Gérer des événements
- 1) déterminer qui va recevoir et traiter les
événements provenant des composants (Controller
dans le concept MVC) - décider de la granularité (un ou plusieurs
contrôleurs) - trouver les comportements (interface) à
implémenter par ce (ou ces) contrôleur(s). - Par exemple ActionListener pour les boutons,
ChangeListener pour les JSlider etc. - 2) écrire les méthodes de ces interfaces dans les
objets contrôleurs choisis.
41La source
- L'objet Source émet des événements.
- Il existe une hiérarchie de classes dévénements
- La source enregistre ses listeners par des
méthodes setltEventTypegtListener ou
addltEventTypegtListener. - Toutes les sources dévénements supportent un
modèle multicast pour lémission Plusieurs
listeners peuvent être ajoutés pour une seule
source. - L'API na aucun a priori sur l'ordre dans lequel
les événements sont délivrés.
42Les listeners
- Un objet listener est un objet qui implémente
(remplit le contrat d) une interface spécifique.
- Cette interface (ce contrat) prévoit une ou
plusieurs méthodes qui peuvent être invoquées par
une source dévénements. - Chaque listener reçoit une réplique identique de
lévénement original.
43Exemple
- // dans un fichier MonGestionnaireDeBouton.java
- public class MonGestionnaireDeBouton implements
ActionListener - public void actionPerformed(ActionEvent e)
- System.out.println( bouton
touché !! ) - // fin de la méthode public void
actionPerformed - // fin de la classe MonGestionnaireDeBouton
- Pour que MonGestionnaireDeBouton puisse être
ActionListener, il DOIT implémenter (offrir) la
méthode actionPerformed - // dans le fichier de notre application graphique
. - button.addActionListener(new MonGestionnaireDeBout
on ())
44Comment peindre dans un JPanel ?
public class MaClasse extends JPanel
public void paintComponent(Graphics g) // g
est la boite à peinture fournie par le
système // (fontes, styles de traits, couleurs
etc) super.paintComponent(g) //
pour peindre le fond // dessin
d un rectangle de w100, h200 en 10,
10 g.drawRect(10, 10, 100, 200)
// dessin d une image.
g.drawImage(image, 90, 0, 300, 62, this) //
dessin d une ligne rouge, on sélectionne la
couleur voulue g.setColor(java.awt.Color.red)
// ligne de x10, y10 a x2250, y2123
g.drawLine(0, 0, 250, 123)
// fin de public class MaClasse
45Quelques classes utilitaires
- Les Timers activent des ActionListeners à
intervalles définis délai initial, délai de
répétition. - EventListenerList Classe dans swing.event pour
gérer des Listeners addXXXListener,
removeXXXListener, fireXXXPerformed etc.. - Utilisés par tous les Swing générateurs
dévénements. - Package swingUtilities plus de 30 méthodes
statiques utilitaires.
46Exemple dutilisation Timers
// package à importer import javax.swing. //
création dun Timer de 1000 millisecondes (int)
de temps initial et de temps entre les actions
successives. Lobjet conteneur doit être un
ActionListener. Timer timerUneSeconde new
Timer(1000, this) // ajout dun autre
ActionListener timerUneSeconde.addActionListener(u
nAutreListener) //changement de la valeur de
temps initial timerUneSeconde.setInitialDelay(1000
0) // un seul déclenchement après le temps
initial... timerUneSeconde.setRepeats(false) //
et cest parti timerUneSeconde.start()
47Exemple EventListenerList
// gestion à la manière dun vecteur de couples
(Classe du Listener - Listener)
EventListenerList listenerList new
EventListenerList() listenerList.add(listener1.ge
tClass(), listener1) listenerList.remove(listene
r2.getClass(), listener2) // Retour dun
tableau de paires (Classe du Listener - Listener)
// le tableau retourné est garanti non
null Object pairesClasseListener
listenerList.getListenerList() // Retour dun
tableau de listeners dun type
particulier EventListener listeners
listenerList.getListeners(Class uneClasse) //
exemple d utilisation appel de fooXXX(FooEvent
e) sur tous les // listeners de type Listener1
for (int i pairesClasseListener.length-2 i gt
0 i - 2) if (listenersi
listener1.getClass()) FooEvent
fooEvent new FooEvent(this)
((Listener1)listenersi1).fooXXX(fooEvent)
48Package swingUtilities (1)
- Plus de 30 méthodes statiques utilitairesregroupé
es par catégories fonctionnelles - Méthodes de calcul calculs dintersections,
dunions et de différences entre rectangles.
Méthodes de calcul des dimensions dune String
avec une fonte spécifique. - Méthodes de conversions de coordonnées entre
composants graphiques. - Méthodes qui retournent des informations
daccessibilité pour un composant donné.
49Package swingUtilities (2)
- Méthodes dextraction dobjets associés à un
composant comme le propriétaire du focus, les
ancêtres graphiques ou la fenêtre racine dans
laquelle réside un composant. - Méthodes pour exécuter du code dun thread AUTRE
que le thread de diffusion des événements. - Méthodes booléennes de test de relation, par
exemple si un composant est lancêtre dun autre,
si le thread courant est le dispatch thread ou
quel bouton de la souris a été pressé - Méthodes de layout, de painting etc. pour un
composant donné.
50Vous dompterez Swing !