Implémentation d`IHM en Java avec Swing Plan Les composants d

Implémentation d’IHM en Java
avec Swing
Thierry Duval
ISTIC / IRISA - Bunraku
GLI
Master 2 Informatique GL, Mitic et Miage
2
Plan
!L’API Swing : Java Foundation Class
!Instancier et organiser des composants graphiques
!Gérer les événements en provenance de l’utilisateur
!Gérer les événements logiciels (cf Java Beans)
!Créer ses propres composants graphiques
!Le « Drag’n Drop » AWT en Java avec Swing
3
Les composants d’IHM des JFC
!Java Foundation Class (JFC) :
"nouvel ensemble de composants d'interfaces graphiques,
surnommé Swing
"extérieur au JDK 1.1 (package à ajouter)
encore parfois nécessaire de rajouter ce package dans les
navigateurs HTML utilisant de vieilles machines virtuelles Java
pour des raisons de compatibilité avec de vieux plugins…
"compris dans le JDK depuis la version 1.2
"hérite d'AWT
en particulier pour être capable d’accéder aux ressources
graphiques des machines…
"17 packages dont javax.swing… pour le moment
4
Les JFC (1/2)
!Ensemble de classes écrites suivant le modèle
JavaBeans
!Composants d’interfaces « légers » (100 % Java)
"sauf pour le dessin effectif des composants…
!Look and Feel programmable :
"modèles fournis (Win32, Motif, Mac, Metal)
"modèles personnalisables...
!Classes pour déficients (accessibility)
"support pour développer des technologies d’assistance
"interfaces « alternatives » (braille, …)
5
Les JFC (2/2)
!Architecture MVC :
"Vue et Contrôleur sont dans les composants
"Modèle associé dans un composant qui implémente
l’interface adéquate
"le modèle peut être dérivé ou remplacé…
!Conteneurs avec ascenseurs
!Composants de haut niveau (JList, JTree, JTable)
!Transfert de données (clipboard,drag and drop)
!Graphiques, traitement d’images (API 2D)
6
Swing : les trois parties
!Ensemble de composants d’IHM héritant de
JComponent
"JButton, JFrame, JTable, ...
!Un ensemble de classes support
"ButtonGroup, ImageIcon, DefaultButtonModel, ...
!Un ensemble d’interfaces implémentées par les
modèles des composants et les classes support
"Icon, ButtonModel, ...
7
Swing (jdk 1.6) : 17 paquetages
!javax.swing
!javax.swing.border
!javax.swing.colorchooser
!javax.swing.event
!javax.swing.filechooser
!javax.swing.plaf (.basic, .metal, .multi, .synth)
!javax.swing.table
!javax.swing.text (.html, .html.parser, .rtf)
!javax.swing.tree
!javax.swing.undo
8
Swing : caractéristiques
!Pluggable Look & Feel
!Extensibilité
!Capture des événements clavier
!Personnalisation des bordures de composants
!Tool tips
!Autoscrolling
!Accessibility support
!Localisation support
9
Les différents types de composants
!Containers de plus haut niveau
!Containers généraux
!Containers spécialisés
!Composants interactifs basiques
!Afficheurs non interactifs
!Afficheurs éditables de données structurées
10
Containers de plus haut niveau
!Ils ne peuvent être « contenus »
!IL en faut au moins un par application :
"JApplet
"JFrame
!On peut en utiliser d’autres en plus :
"JDialog
"JOptionPane
11
Containers généraux
!Pour regrouper des composants, classique…
"JPanel
"JScrollPane
"JSplitPane
"JTabbedPane
"JToolBar
12
Containers spécialisés
!Pour des utilisations particulières…
"JInternalFrame
"JDesktopPane
"JLayeredPane
"JRootPane
13
Composants interactifs basiques (1/2)
!Ceux qu’on utilise « tout le temps » !
"JButton
"JCheckBox
"JRadioButton
"JMenuItem
"JCheckBoxMenuItem
"JRadioButtonMenuItem
"JToggleButton
"JComboBox
"JList
"JSlider
14
Composants interactifs basiques (2/2)
!Suite…
"JTextField
"JPasswordField
"JMenuBar
"JPopupMenu
15
Afficheurs non interactifs
!Pour informer…
"JLabel
"JProgressBar
"JToolTip
16
Editeurs de données structurées
!Il faudrait les inventer s’ils n’existaient pas…
"JColorChooser
"JFileChooser
"JTable
"JTextArea
"JTree
17
Swing : les composants d’IHM (1/5)
18
Swing : les composants d’IHM (2/5)
#JApplet
#JButton
#JCheckBox
#JCheckBoxMenuItem
#JColorChooser
#JComponent
#JDesktopIcon
#JDesktopPane
#JDialog
#JFileChooser
#JFrame
#JInternalFrame
#JLabel
#JLayeredPane
19
Swing : les composants d’IHM (3/5)
#JList
#JMenu
#JMenuBar
#JMenuItem
#JOptionPane
#JPanel
#JPasswordField
#JPopUpMenu
#JProgressBar
#JRadioButton
#JRadioButtonMenu
#JMenuItem
#JScrollBar
#JScrollPane
20
Swing : les composants d’IHM (4/5)
#JSeparator
#JSlider
#JSplitPane
#JTabbedPane
#JTable
#JTextArea
#JTextPane
#JToggleButton
#JToolBar
#JTextPane
#JToggleButton
#JToolTip
#JTree
#JViewport
#JWindow
21
Swing : les composants d’IHM (5/5)
!« Le répertoire du jdk »/demo/jfc/CodePointIM
!« Le répertoire du jdk »/demo/jfc/FileChooserDemo
!« Le répertoire du jdk »/demo/jfc/Font2DTest
!« Le répertoire du jdk »/demo/jfc/Java2D
!« Le répertoire du jdk »/demo/jfc/MetalWorks
!« Le répertoire du jdk »/demo/jfc/Notepad
!« Le répertoire du jdk »/demo/jfc/SampleTree
!« Le répertoire du jdk »/demo/jfc/Stylepad
!« Le répertoire du jdk »/demo/jfc/SwingApplet
!« Le répertoire du jdk »/demo/jfc/SwingSet2
!« Le répertoire du jdk »/demo/jfc/SwingSet3
!« Le répertoire du jdk »/demo/jfc/TableExample
22
SwingSet2 (1/5)
23
SwingSet2 (2/5)
24
SwingSet2 (3/5)
25
SwingSet2 (4/5)
26
SwingSet2 (5/5)
27
Java2D (1/3)
28
Java2D (2/3)
29
Java2D (3/3)
30
Instanciation et organisation
!Composants logiciels d'interfaces
!Organisation (graphique) des composants
!Gestion de quelques événements
31
Faire une application interactive
!Pour une véritable application (pas une JApplet),
placer les composants de dialogue dans une
instance de JFrame ou d’une classe dérivée de
JFrame :
"utiliser un listener à l’écoute des événements susceptibles
d’arriver à cette fenêtre principale :
en particulier pour terminer l’application…
"lui ajouter des sous-composants graphiques ...
add (BorderLayout.NORTH, new UnBouton ())
"lui donner une taille :
pack () ou bien setSize (largeur, hauteur)
"lui demander de montrer son contenu :
setVisible (true) // anciennement : show ()
32
Le container de départ : JFrame
!Héritage :
"java.lang.Object
"java.awt.Component
"java.awt.Container
"java.awt.Window
"java.awt.Frame
"javax.swing.JFrame
!Fenêtre de plus haut niveau avec titre et bord
!Est associé par défaut à un BorderLayout…
33
JFrame
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class MyVeryFirstJFrame extends JFrame {
private static final long serialVersionUID = 1L;
class Fermeur extends WindowAdapter {
public void windowClosing (WindowEvent e) {
System.exit (0) ;
}
}
public MyVeryFirstJFrame () {
super ("My Very First JFrame") ;
addWindowListener (new Fermeur ()) ;
getContentPane ().setBackground (Color.cyan) ;
setSize (800, 600) ;
setVisible (true) ;
}
public static void main (String argvs []) {
new MyVeryFirstJFrame () ;
}
}
34
Positionnement : BorderLayout
!Héritage :
"java.lang.Object
"java.awt.BorderLayout
!Gestionnaire de positionnement à 5 zones :
"BorderLayout.NORTH
"BorderLayout.SOUTH
"BorderLayout.EAST
"BorderLayout.WEST
"BorderLayout.CENTER
35
JFrame et BorderLayout (1/2)
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyFirstJFrame extends JFrame {
private static final long serialVersionUID = 1L;
public MyFirstJFrame () {
super ("My First JFrame") ;
addWindowListener (new Fermeur ()) ;
getContentPane ().add (BorderLayout.NORTH, new JButton ("North")) ;
getContentPane ().add (BorderLayout.SOUTH, new JButton ("South")) ;
getContentPane ().add (BorderLayout.EAST, new JButton ("East")) ;
getContentPane ().add (BorderLayout.WEST, new JButton ("West")) ;
getContentPane ().add (BorderLayout.CENTER, new JButton ("Center")) ;
pack () ;
setVisible (true) ;
}
public static void main (String argvs []) {
new MyFirstJFrame () ;
}
}
36
JFrame et BorderLayout (2/2)
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class Fermeur extends WindowAdapter {
public void windowClosing (WindowEvent e) {
System.exit (0) ;
}
}
37
Positionnement : GridLayout
!Héritage :
"java.lang.Object
"java.awt.GridLayout
!Gestionnaire de positionnement en lignes et
colonnes
!Toutes les « cases » sont de taille identique
38
JFrame et GridLayout v1
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyJFrameWithGridLayout extends JFrame {
private static final long serialVersionUID = 1L;
public MyJFrameWithGridLayout () {
super ("JFrame With GridLayout") ;
addWindowListener (new Fermeur ()) ;
// rangement en 3 lignes de 2 colonnes
setLayout (new GridLayout (3,2)) ;
add (new JButton ("1")) ; add (new JButton ("2")) ;
add (new JButton ("3")) ; add (new JButton ("4")) ;
add (new JButton ("5")) ; add (new JButton ("6")) ;
pack () ;
setVisible (true) ;
}
public static void main (String argvs []) {
new MyJFrameWithGridLayout () ;
}
}
39
JFrame et GridLayout v2
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyJFrameWithGridLayout extends JFrame {
private static final long serialVersionUID = 1L;
public MyJFrameWithGridLayout () {
super ("JFrame With GridLayout") ;
addWindowListener (new Fermeur ()) ;
// rangement en 3 lignes de 2 colonnes
setLayout (new GridLayout (3,2)) ;
add (new JButton ("1")) ; add (new JButton ("2")) ;
add (new JButton ("3")) ; add (new JButton ("4")) ;
add (new JButton ("5")) ; add (new JButton ("6")) ;
setSize (300, 450) ;
setVisible (true) ;
}
public static void main (String argvs []) {
new MyJFrameWithGridLayout () ;
}
}
40
Positionnement : GridBagLayout
!Gestionnaire de positionnement souple :
"fait des alignements horizontaux et verticaux
"maintient une grille rectangulaire et dynamique de cellules
"les contenus ne sont pas forcément de la même taille :
un composant peut occuper plusieurs cases de la grille
!Chaque composant géré par un GridBagLayout est
associé à une instance de GridBagConstraints qui
précise comment le composant doit être placé dans
sa zone d’affichage
1 / 30 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !