1.Conception d’IHM en Java
Do it with Swing
Cedric.Dumas@emn.frcontrat Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique 2.0 France License
2.2
GUI Toolkits / Boîtes à Outils : Swing
Java
Graphics(2D)
Swing
OpenGL
Système d'Exploitation
Machine Virtuelle
Window
Manager
3.3
Construire une application (en Swing)
1 fenêtre
1 arbre d'affichage
1 gestionnaire d'espace
des widgets
des gestionnaires d'évènements
4.4
1 – Une fenêtre
Structurer l’espace d’affichage
Partager la ressource écran
Dépendante du Gestionnaire de fenêtres
Fenêtre = zone autonome
pour l’affichage
pour les entrées
5.5
1 – Une fenêtre
Accès partagé à l'écran
Subdivision de l'écran en fenêtres
Chaque fenêtre est positionné (x, y, z) et dimensionnée (largeur x hauteur)
6.6
2 – Un arbre d'affichage
Afficher = appeler une succession de fonctions graphiques
Représentation sous forme d'un arbre d'affichage
9.2 – Arbre Swing
JFrame
JMenuBar
JMenu File
JMenu View
JMenu Help
JMenuItem Open
JMenuItem Save
JMenuItem Save as…
JMenuItem Undo
JMenuItem
JMenuItem About…
JMenuItem Quit
JMenuItem Paste
JMenuItem Copy
10.10
2 – Un arbre d'affichage
Les langages à objets permettent de représenter ces nœuds comme des objets ayant une interface
Tous les nœuds héritent d'une classe de base (JComponent dans Swing)
Chaque composant particulier spécifie une interface particulière adaptée à sa sémantique
11.11
2 – Un arbre d'affichage
Basé sur des containers
générique
gère collection de composants
design Pattern composite
12.12
2bis – Layout Manager
Liés aux containers
13.13
2bis – Calcul du placement
Le placement est calculé dans les conteneurs
Soit les composants sont placés explicitement (x, y, largeur, hauteur)
Soit ils sont gérés par un « LayoutManager » qui calcul ces paramètres dynamiquement
besoins du composant (taille min, max, normale) + positionnement relatif
14.14
2bis – Mise en place d ’un gestionnaire de placement
Les conteneurs définissent la méthode setLayout(layoutManager) pour changer le gestionnaire par défaut
Le gestionnaire par défaut change d ’une classe de conteneur à une autre
La méthode pack() déclenche le calcul du placement
La méthode invalidate() rend le placement courant invalide
15.15
2bis – Les gestionnaires de placement...
FlowLayout
Place les composants de gauche à droite
CardLayout
Superpose les composants
GridLayout
Découpe en une grille régulière sur laquelle les composants sont placés
GridBagLayout
Découpe en une grille et place les composants sur une ou plusieurs cases
16.16
2bis – ...ou Layout Manager
BorderLayout
Découpe en 5 régions: south, north, east, west, center
Aucun : .setBounds(x,y,h,l);
17.17
3 – les widgets
18.3 – Les composants graphiques interactifs = widgets
Le nœud est capable de s'afficher et de gérer les événement
On lui ajoute une interface de communication suivant sa sémantique
bouton, label, menu, ligne de texte, etc.
On appelle ce nœud communicant un composant ou widget ou gadget ou objet de contrôle.
19.19
3 – JMenu
Une instance de JMenuBar par Jframe
setJMenuBar(JMenuBar mb);
Plusieurs Jmenu par JMenuBar
add(JMenu jm);
Plusieurs JMenuItem/JCheckboxMenu par Jmenu
add(JMenuItem mi);
addSeparator();
Structurez !!!
20.20
3 – JPanel
JPanel
conteneur
JScrollPane
un seul composant !
barres de défilement
JScrollPane sp = new JScrollPane();
sp.add(monJLabel);
sp.setViewportView (monJLabel);
composants implémentant Scrollable
class MonLabel extends Jlabel implements Scrollable
Panel
ScrollPane
21.21
3 – Les composants de SWING
Dialog
Frame
Split pane
Tabbed Pane
Tool bar
Internal frame
Layered pane
22.22
3 – Composants de Swing
File chooser
Color chooser
Table
Text
Tree
List
Slider
Progress bar
Tool tip
23.4 – un gestionnaire d'évènements
Les dispositifs d'entrée génèrent des événements (petit bloc mémoire contenant un type, un temps, une fenêtre cible et des détails suivant le type)
Swing achemine l'événement vers un nœud cible
Le nœud gère l'événement, ce qui peut modifier l'état de l'arbre d'affichage
On passe à l'événement suivant
24.4 – Acheminement des événements
Positionnel (souris)
on regarde quel est le nœud de l'arbre le plus près de la position
On l'envoie au plus prés, qui renvoie a son père s'il ne veut pas le gérer
Non positionnel (clavier)
si un nœud à le "focus", on lui envoie
traduction d'une touche en caractère(s) ou action
sinon, on cherche une cible
gestion des raccourcis clavier
25.4 – Arbre Swing
JFrame
JToolBar
JPanel
JTextArea
JButton
JButton
JList
JButton
X
Y
Event |time | (X,Y)
26.4 – Les événements
Package java.awt.event.*
Héritent de la classe java.awt.AWTEvent
identificateur (numéro unique)
consumed (a-t-il été utilisé?)
source (qui l'a émis)
Envoyés dans une file unique
Toolkit.getSystemEventQueue()
Lus par un thread spécique
27.4 – Types d’événements
28.4 – Association de gestionnaires d ’actions
Pour chaque famille d ’événements, une interface « listener » est définie
MouseListener, MouseMoveListener, KeyListener, etc.
Chaque classe composant définit « addListener(Listener )
Frame
Button
ActionListener
actionPerformed(ActionEvent e)
addActionListener(ActionListener)
29.4 – Les listeners
Chaque composant peut renvoyer certains événements à l'application si elle le demande
Le renvoi se fait par un Listener
actionListener, AdjustmentListener, FocusListener, InputMethodListener, ItemListener, KeyListener, MouseListener, MouseMotionListener, TextListener, WindowListener
30.4 – Sur tous les composants Swing
component listener
Listens for changes in the component's size, position, or visibility.
focus listener
Listens for whether the component gained or lost the ability to receive keyboard input.
key listener
Listens for key presses; key events are fired only by the component that has the current keyboard focus.
mouse listener
Listens for mouse clicks and mouse movement into or out of the component's drawing area.
mouse-motion listener
Listens for changes in the cursor's position over the component.
mouse-wheel listener (introduced in 1.4)
Listens for mouse wheel movement over the component.