Swing, introduction

Swing, introduction
Sébastien Jean
IUT de Valence
Département Informatique
v1.0, 10 mai 2014
Introduction
Swing en bref
Swing (Standard Widget Toolkit) est un canevas logiciel
(framework) qui permet de réaliser des applications graphiques
Il (repose sur et) complète le canevas AWT (Abstract Window
Toolkit) utilisé précédemment
Il tend à être remplacé par JavaFX aui, à terme, doit devenir le
standard
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
1 / 30
Introduction
Organisation hiérarchique des éléments
Une interface graphique Swing est structurée sous la forme d’un arbre
de composants graphiques (objets de type JComponent)
les feuilles sont des composants directement affichables (boutons,
...)
les noeuds internes sont des conteneurs
la racine est un conteneur racine (top-level container)
L’organisation des composants dans un conteneur est sous la
responsabilité d’un gestionnaire de placement(Layout Manager)
Remarque :
En fait, tous les composants sont des conteneurs
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
2 / 30
Introduction
Programmation événementielle
La programmation des interfaces graphiques en Swing est
événementielle
Les composants graphiques génèrent des événements
clic sur un bouton, ajout de texte dans une zone de texte, . . .
Ces événements peuvent être capturés et traités via des auditeurs
d’événements : patron de conception observeur↔observé
1
s'abonne
à la notification de l'événement
Source
de l'événement
notifie l'événement
3
2
Auditeur
de l'événement
4
traite l'événement
génère l'événement
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
3 / 30
Introduction
Programmation événementielle (suite)
Couplage faible entre producteur et auditeur par une interface
définissant les méthodes de callback
Liste des auditeurs
enregistrés
InterfaceAuditeur
1'
x
public void notifie(Evenement evenement)
3
...
Auditeur
de l'événement
1
Source
de l'événement
2
public void abonne(InterfaceAuditeur auditeur)
Un producteur d’événements peut avoir plusieurs auditeurs
Chaque événement est notifié séquentiellement à tous les auditeurs
Un auditeur d’événements peut (en général) se désabonner
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
4 / 30
Conteneurs et composants
Conteneurs racines
JFrame, fenêtre principale
Une application graphique peut-être composée de plusieurs fenêtres
(JFrame) indépendantes, mais dans la majorité des cas les applications
sont plutôt organisées sous la forme d’une fenêtre principale (JFrame)
contenant plusieurs sous-fenêtres (JInternalFrame)
Barre de menu
(optionnelle)
Panneau principal
(Content Pane)
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
5 / 30
Conteneurs et composants
Conteneurs racines (suite)
JDialog, boîte de dialogue
JApplet, fenêtre graphique affichée dans un navigateur web
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
6 / 30
Conteneurs et composants
Autres conteneurs
JPanel, panneau simple
JScrollPane, panneau avec défilement (horizontal/vertical)
Contenu plus grand que ce qui est réellement affiché
JSplitPane, panneau divisé en 2 parties
division verticale ou horizontale, séparation par une cloison mobile
JTabbedPane, panneau à onglets
JOptionPane, boite de dialogue personnalisable, avec ou sans choix
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
7 / 30
Conteneurs et composants
Autres composants simples
JLabel, étiquette avec texte et/ou image non sélectionnable
JButton, bouton simple avec texte et/ou image
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
8 / 30
Conteneurs et composants
Autres composants simples
JCheckBox, case à cocher avec légende
faisant implicitement partie d’un groupe où plusieurs cases peuvent
être simultanément cochées
JRadioButton, bouton radio avec légende
faisant explicitement partie d’un groupe (ButtonGroup) où un seul
bouton peut être sélectionné
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
9 / 30
Conteneurs et composants
Autres composants simples
JComboBox, liste déroulante de choix (texte)
JSlider, curseur coulissant
JSpinner, liste de choix (texte) commutables par boutons
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
10 / 30
Conteneurs et composants
Autres composants simples
JTextField, JTextArea,texte non formaté éditables
JProgressBar, barre de progression
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
11 / 30
Conteneurs et composants
Autres composants plus complexes
JEditorPane / JTextPane, texte formaté éditable
JList, liste
couplé à une collection d’objets par un modèle (ListModel)
JTable, tableau
couplé à une collection d’objets par un modèle (TableModel)
JTree, arbre
couplé à une collection d’objets par un modèle (TreeModel)
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
12 / 30
Exemples basiques
JFrame
Une fenêtre simple
cf. code source, paquetage fr.iutvalence.java.cm9.jframe
ApplicationDAffichageDeFenetreSimple
Application qui démarre la tâche d’affichage de l’IHM
TacheDAffichageDeFenetreSimple
Tâche gérant l’affichage de l’IHM
doit implémenter l’interface java.lang.Runnable
Crée la fenêtre et lui donne des propriétés (titre, dimensions)
Remarque : une fenêtre ne s’auto-dimensionne pas en fonction de son
contenu, c’est l’inverse
Rend la fenêtre créée explicitement visible
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
13 / 30
Exemples basiques
JFrame
Une fenêtre simple : remarques
Le main se termine alors que la fenêtre reste affichée
Avec Swing, la fin du main ne marque plus la fin de l’application
Fermer la fenêtre ne termine pas (forcément) l’application
L’objet JFrame est toujours présent (la fenêtre pourrait être réaffichée),
aucun événement n’est généré tant que la fenêtre est invisible
La destruction d’un composant s’effectue par appel à la méthode
dispose, l’application se termine lorsqu’il n’y a plus de
composants à gérer
Il est possible de configurer la fenêtre pour qu’elle soit
automatiquement détruite à sa fermeture
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
14 / 30
Exemples basiques
JFrame
Modèle de concurrence
L’interface graphique est sous le contrôle d’un unique fil d’exécution
(thread) appelé event dispatch thread
Les traitements plus longs peuvent être pris en charge de manière
asynchrone par d’autres fils d’execution appelés workers
thread
d'un worker
code du worker
thread
event dispatch
boucle de gestion
d'évenement
terminaison
du worker
thread
main
Démarrage de
la tâche IHM
Traitement ne manipulant pas directement les composants graphiques
temps
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
15 / 30
Exemples basiques
JButton
Une fenêtre exposant un bouton
cf. code source, paquetage fr.iutvalence.java.cm9.jbutton
Remarques :
Il est possible de rendre actif/inactif un bouton via l’appel à la
méthode setEnabled(true/false)
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
16 / 30
Exemples basiques
JButton
Une fenêtre exposant un bouton avec auditeur d’évènement
cf. code source, paquetage
fr.iutvalence.java.cm9.jbuttonlistener
Remarques :
ActionListener est l’interface d’audition d’évènement
polyvalente pour les composants, il en existe de plus spécifiques
KeyListener, MouseListener, ItemListener, . . .
Il est possible d’ajouter autant d’auditeurs d’évènement que l’on veut
sur un composant (addActionLister) et d’en retirer à tout moment
(removeActionListener)
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
17 / 30
Exemples basiques
JMenu, JDialog
Une fenêtre disposant d’un menu
cf. code source, paquetage fr.iutvalence.java.cm9.jmenu
Remarques :
Un auditeur d’évènement ActionListener doit être associé à
chaque item de menu
Un seul auditeur sachant distinguer la source peut suffire
JOptionPane est surtout utilisée comme une classe utilitaire
(méthodes statiques) permettant d’afficher des boites de dialogues
standards, à choix ou non
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
18 / 30
Application exemple
Réalisation d’un convertisseur Bin/Dec/Hex
cf. code source, paquetage
fr.iutvalence.java.cm9.convertisseur
Convertisseur binaire/décimal/hexadécimal
Sélection de la base
Saisie des symboles avec un clavier réel ou virtuel
Le clavier virtuel s’adapte à la base
Remise à zéro (des symboles)
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
19 / 30
Application exemple
Layout : JFrame
JMenuBar + JSplitPane vertical
JFrame
JMenuBar
JSplitPane
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
20 / 30
Application exemple
Layout : JSplitPane supérieur
JLabel + JSplitPane vertical
JSplitPane
JLabel
JSplitPane
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
21 / 30
Application exemple
Layout : JSplitPane intermédiaire
JPanel + JSplitPane vertical
JPanel de sélection de la base → grille de 1x3 JRadioButton
(GridLayout)
JSplitPane
JPanel
JSplitPane
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
22 / 30
Application exemple
Layout : JSplitPane inférieur
JPanel + JButton
JPanel de saisie des symboles → grille de nxm JButton (GridLayout)
JSplitPane
JPanel
JButton
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
23 / 30
Application exemple
Auditeurs d’événements
Capture des appuis touches
KeyListener sur l’objet JFrame
Implementé par l’objet
TacheDAffichageDuConvertisseurBinDecHex
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
24 / 30
Application exemple
Auditeurs d’événements
Menus
ActionListener sur chaque JMenuItem
Implementé par l’objet BarreDeMenuDuConvertisseurBinDecHex
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
25 / 30
Application exemple
Auditeurs d’événements
Capture des clics
ActionListener sur chaque JButton et JRadioButton
Implementé par l’objet
TacheDAffichageDuConvertisseurBinDecHex
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
26 / 30
Application exemple
JSplitPane : détails
Verrouillage de la séparation
setEnabled(false)
Remarque : méthode présente sur presque tous les composants, mais
pas toujours la même sémantique
Réglage de la taille du le séparateur
setDividerSize(int)
Modification du rendu de la bordure
setBorder(Border)
Remarque : méthode présente sur presque tous les composants
Modification des tailles relatives des composants
setResizeWeight(double)
Remplacement d’une partie
setTopComponent(JComponent), . . .
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
27 / 30
Application exemple
JPanel : détails
Association d’un layout
setLayout(Layout)
GridLayout
Placement des composants en grille
Spécification des dimensions à la création
Placement ligne par ligne, colonne par colonne
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
28 / 30
Application exemple
Fin !
Sébastien Jean (IUT Valence)
Swing, introduction
v1.0, 10 mai 2014
29 / 30