interfaces graphiques Java Swing
Page 1
Toolkits graphiques Java
Il y en a trois !
AWT Components, obsol te
Swing support par Oracle (autrefois Sun)
Swing repose sur AWT
mais Swing != AWT !
SWT libre, initi par IBM / Eclipse
tous (+ ou -) multi-plateformes
J F C
Les classes Swing font partie d un ensemble plus vaste
de classes pour les IHM qui a t appel les Java
Fondation Classes.
Les JFC contiennent :
java.awt, javax.swing, le package java.awt.geom pour
dessiner du 2D, java.awt.dnd pour le drag and drop,
javax.accessibility pour d velopper des applications
adapt es aux personnes handicap es, javax.swing.plaf
pour modifier le look and feel, etc.
Page 2
Source: documentation IBM
Composants Swing
Page 3
Interacteurs
Page 4
Boutons
JButton
JCheckbox :
choix id pendants
JRadioButton :
choix exclusif : cf. ButtonGroup
Source: documentation Java Oracle
Page 5
Texte
JTextField
JPasswordField
Page 6
JTextArea :
texte simple multilignes
Ascenseur :
cf. JScrollPane
JEditorPane : texte avec styles
compatible HTML et RTF
Conteneurs
JPanel: conteneur g n rique
...
JScrollPane:
avec ascenseurs int gr s
JSplitPane:
avec diviseur int gr
Page 7
Conteneurs
JToolBar: barre doutils
(sous la barre de menus)
JTabbedPane:
onglets
JTree
JTable
Page 8
Conteneurs sp cifiques
JInternalFrame
placer dans un JDesktopPane
qui joue le r le de bureau virtuel
JLayeredPane permet de superposer
des composants
voir aussi JRootPane pr sent plus loin
JDesktopPane h rite de JLayeredPane
Page 9
Fen tres
JFrame : fen tre principale de lapplication
JDialog : fen tre secondaire
normalement d pendante de la JFrame :
" pas diconification s par e, toujours au dessus de la JFrame
g n ralement temporaire :
" bloque linteraction, impose lutilisateur de r pondre
Page 10
Fen tres
JRootPane implicitement cr
par JApplet, JDialog, JFrame
et JInternalFrame
Page 11
Bo tes de dialogue pr d finies
JFileChooser
JColorChooser
Particularit
peuvent tre cr s :
" comme composants internes
" ou comme bo tes de dialogue
JOptionPane (multiples variantes)
Page 12
Applets
Page 13
Menus
Page 14
Applet = composant de premier niveau
pour les applications dans pages Web
raccourci
clavier
(accelerator)
mn monique
Arbre dinstanciation
Arbre dinstanciation
arbre de liation des instances de composants graphiques
Page 15
Arbre dinstanciation
Chaque objet graphique contient ses enfants
superposition : enfants afch s au dessus des parents
clipping : enfants d coup s : ne d passent pas des parents
Page 16
Arbre dinstanciation
Attention : ne pas confondre avec larbre dh ritage !
arbre dinstanciation = arbre de liation des instances
arbre dh ritage = hi rarchie des classes
Page 17
Arbre dinstanciation
Objet de plus haut niveau de larbre
JFrame ou JApplet
Les conteneurs peuvent tre embo t s
en particulier les JPanels
Les layout managers assurent la disposition spatiale
un layout manager par conteneur
d faut pour JPanel : FlowLayout, pour JWindow : BorderLayout, etc.
Ne pas oublier dappeler
frame.pack( )
frame.setVisible(true)
// calcul r cursif des positions et des tailles
// fait appara tre la fen tre
Page 18
Exemple : version 0
// donne acc s aux composants Swing
import javax.swing.*;
public class BipBip extends JFrame { // fen tre principale
JButton button = null;
public static void main(String argv[ ]) {
BipBip toplevel = new BipBip(); // en gris : optionnel
}
public BipBip() {
button = new JButton ("Please Click Me !");
getContentPane().add(button); // en gris : n cessaire avant version 5
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Bib Bip");
pack();
setVisible(true); // fait appara tre linterface
// calcule la disposition spatiale
}
}
Page 19
Exemple : version 0
Notes et rappels
package javax.swing
une seule classe public par fichier, le fichier doit avoir le m me nom
button est une variable dinstance (on peut linitialiser contrairement C++)
toplevel est une variable locale
main() est une m thode de classe (cf. static)
les m thodes dinstance ont automatiquement acc s aux variables dinstance
elles ont un param tre cach this qui pointe sur linstance
getContentPane() n cesaire avant la version 5 cause du JRootPane
JWindow.add() a t red fini dans les versions ult rieure de Java
Page 20
Ev nements
Ev nements
envoy s lapplication cibl e
chaque action l mentaire de lutilisateur
Page 21
Boucle de gestion des v nements
Boucle infinie qui
r cup re les v nements
appelle les fonctions de callback des composants graphiques
Lanc e automatiquement
la fin de la fonction main() dans le cas de Java
Page 22
Pattern Observateur/Observ
Principe
associer un(des) observateur(s) un(des) objet(s) observ (s)
observateur(s) notifi (s) automatiquement quand une certaine
condition se produit sur un observ
Page 23
Application aux interfaces graphiques
Les observateurs d tectent les v nements
ce sont des fonctions de callback (en C, C++...)
ou des objets : Listeners en Java
" leurs m thodes font office de fonctions de callback
Page 24
Ev nements Java
Ev nements AWT et Swing
objets correspondant des cat gories d venements
les principaux h ritent de java.awt.event.AWTEvent
Ev nements de bas niveau
Publicité
/ MouseEvent appuyer, relacher, bouger la souris ...
/ KeyEvent appuyer, relacher une touche clavier...
WindowEvent
FocusEvent
etc.
fermeture des fen tres ....
focus clavier (= o vont les caract res tap s au clavier)
Ev nements de haut niveau
/ ActionEvent activer un bouton, un champ textuel ...
abstraction des v nements de bas niveau
/ TextEvent modification du texte entr
etc.
Page 25
Ev nements Java
M thodes communes aux AWTEvent
getSource() objet producteur (Object)
/ getID() type d v nement (int)
Exemple: m thodes de MouseEvent
getX(), getY()
getClickCount()
getModifiers()
getWhen()
etc.
Page 26
Observateurs d v nements
Event Listeners
chaque classe d v nement correspond une classe dEventListener
(en g n ral)
Exemple : ActionEvent
Ev nement : ActionEvent
Listener : ActionListener
M thode : actionPerformed(ActionEvent)
Page 27
Observateurs d v nements
Exemple : MouseEvent
Ev nement : MouseEvent
Listener : MouseListener
M thodes :
" mouseClicked(MouseEvent)
" mouseEntered(MouseEvent)
" mouseExited(MouseEvent)
" mousePressed(MouseEvent)
" mouseReleased(MouseEvent)
Listener : MouseMotionListener
M thodes :
" mouseDragged(MouseEvent)
" mouseMoved(MouseEvent)
Remarque
toutes les m thodes doivent tre impl ment es
car les Listeners sont des interfaces (au sens du langage Java)
Page 28
Rendre les composants r actifs
Associer des Listeners aux composants graphiques
un composant peut avoir plusieurs listeners
un m me listener peut tre associ plusieurs composants
Page 29
Exemple : version 1
import javax.swing.*;
import java.awt.event.*;
public class BipBip extends JFrame {
JButton button;
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
class Ecoute implements ActionListener
{
// m thode appel e quand on active le bouton
public void actionPerformed(ActionEvent e) {
System.out.println("Done!");
button = new JButton ("Do It!");
add(button);
}
}
// cr er et associer un ActionListener
Ecoute elc = new Ecoute();
button.addActionListener(elc);
Probl me ?
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Page 30
Exemple : version 1
import javax.swing.*;
import java.awt.event.*;
public class BipBip extends JFrame {
JButton button;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
button = new JButton ("Do It!");
add(button);
// cr er et associer un ActionListener
Ecoute elc = new Ecoute();
button.addActionListener(elc);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Page 31
class Ecoute implements ActionListener
{
public void actionPerformed(ActionEvent e) {
System.out.println("Done!");
label.setText("Done!"); // ne compile pas !
}
}
Probl me :
communication entre objets
comment le Listener peut-il agir
sur les composants graphiques ?
Exemple : version 1
import javax.swing.*;
import java.awt.event.*;
public class BipBip extends JFrame {
JButton button;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
button = new JButton ("Do It!");
add(button);
// cr er et associer un ActionListener
Ecoute elc = new Ecoute(this);
button.addActionListener(elc);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Page 32
class Ecoute implements ActionListener {
BipBip mainWin;
public Ecoute (BipBip mainWin) {
this.mainWin = mainWin;
}
public void actionPerformed(ActionEvent e) {
System.out.println("Done!");
mainWin.label.setText("Done!");
}
}
Solution
le Listener doit conserver une
r f rence vers la partie graphique
solution flexible mais lourde...
Objets hybrides
A la fois composant graphique et Listener
un seul objet => plus de probl me de communication entre objets !
principe de lh ritage multiple
" simplifi dans le cas de Java : on ne peut h riter de fa on multiple
que des sp cifications (i.e. des interfaces)
Page 33
Exemple : version 2
import javax.swing.*;
import java.awt.event.*;
public class BipBip extends JFrame
implements ActionListener {
JButton button;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
} // fin de la classe BibBip
add(button = new JButton ("Do It"));
// BibBip est la fois un JFrame et un Listener
button.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
Remarque
actionPerformed() acc s label
car cest une m thode dinstance
de BibBip
Autre probl me ?
}
Page 34
Exemple : version 2
import javax.swing.*;
import java.awt.event.*;
Publicité
public class BipBip extends JFrame
implements ActionListener {
JButton button;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
add(button = new JButton ("Do It"));
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
} // fin de la classe BibBip
// BibBip est la fois un JFrame et un Listener
button.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
Probl me : plusieurs boutons
comment avoir plusieurs
comportements avec
un seul Listener ?
}
Page 35
Exemple : version 2
import javax.swing.*;
import java.awt.event.*;
public class BipBip extends JFrame
implements ActionListener {
JButton doIt, close;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
add(doIt = new JButton ("Do It"));
add(close = new JButton ("Close"));
doIt.addActionListener(this);
close.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
Page 36
public void actionPerformed(ActionEvent e) {
if (e.getSource() == doIt)
label.setText("Done!");
else if (e.getSource() == close)
System.exit(0);
}
}
Solution
distinguer les boutons gr ce
" getSource() ou
" getActionCommand()
la 1ere solution est plus s re
peu adapt si beaucoup de
commandes
Avantages et inconv nients
Version 1
plus souple :
autant de listeners que l'on veut
mais lourd et peu concis :
on multiplie les objets et les lignes
de code
Version 2
plus simple mais limit :
on ne peut avoir qu'une seule
m thode actionPerformed()
peu adapt si beaucoup de
commandes
Page 37
3eme solution : classes imbriqu es
Classes d finies lint rieur dune autre classe
ont acc s aux variables dinstance des classes qui les contiennent
Combinent les avantages des 2 solutions
pr c dentes
souplesse sans la lourdeur
Page 38
Exemple : version 3
import javax.swing.*;
import java.awt.event.*;
BipBip extends JFrame {
JButton doIt, close;
JLabel label = new JLabel();
public static void main(String argv[ ]) {
new BipBip();
}
public BipBip() {
class DoItListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
}
class CloseListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
add(doIt = new JButton ("Do It"));
add(close = new JButton ("Close"));
} // fin de la classe BibBip
doIt.addActionListener(new DoItListener( ));
close.addActionListener(new CloseListener( ));
Remarque
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
actionPerformed() acc s
label car DoItListener est une
classe imbriqu e de BibBip
}
Page 39
Synth se
Page 40
Remarques
Remarques
les classes imbriqu es peuvent galement servir encapsuler limpl mentation
le terme exact est classes internes (inner classes en Anglais)
Page 41
Classes imbriqu es anonymes
Classes imbriqu es... qui nont pas de nom !
public class BipBip extends JFrame {
JLabel label = new JLabel(); // label doit tre une variable dinstance (pas une variable locale)
......
// car elle est r f renc e dans une m thode dinstance
public BipBip() {
JButton doIt = new JButton ("Do It");
add(doIt);
doIt.addActionListener(new ActionListener( )) { // sous-classe anonyme de ActionListener
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
});
......
Page 42
abstract class MyButton extends JButton implements ActionListener {
MyButton(String name) {
super(name);
addActionListener(this);
}
}
public class BipBip extends JFrame {
JLabel label = new JLabel();
......
public BipBip() {
add(new MyButton("Do It")) {
public void actionPerformed(ActionEvent e) {
label.setText("Done!");
}
});
......
Page 43
Conflits
public class BipBip extends JFrame {
JButton close = new JButton("Close");
class CloseListener implements ActionListener {
boolean close = false
public void actionPerformed(ActionEvent e) {
setVisible(close);
// OK
setVisible(BipBip.close);
// FAUX : pas le bon close
this.setVisible(close);
// ERREUR : pas le bon this
BipBip.this.setVisible(close);
// OK
}
}
M me nom de variable dans classe imbriquante et classe imbriqu e
/ 1) viter !
/ 2) pr fixer par le nom de la classe
Page 44
Remarques sur les constructeurs
abstract class MyButton extends JButton implements ActionListener {
public MyButton(String name, Icon icon) {
super(name, icon);
........
}
public MyButton (String name) {
this(name, null);
}
}
Un constructeur peut en appeler un autre
Page 45
Remarques sur les constructeurs
abstract class Toto {
static { // constructeur de classe
.......
Publicité
}
}
Constructeur de classe
sert effectuer des op rations sur les variables de classe (initialisations)
nexiste pas en C++
Page 46
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Applets
Application
Programme ind pendant
" interpr t par la commande java
Structure
" h rite de JFrame (pour une GUI)
" m thode main()
" peut tre interfac e avec un autre langage (interfaces natives)
Applet (appliquette)
Programme pour navigateur Web
" interpr t par navigateur Web ou commande appletviewer
" attention: restrictions dacc s (fichiers, sockets ...)
Structure
" h rite de JApplet
" m thode init() (pas de new !)
Page 47
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Scribble : dessin dans une applet
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Scribble extends JApplet
implements MouseListener, MouseMotionListener
{
private int last_x, last_y;
public void init( ) {
// enregistrer les Listeners
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setBackground(Color.white);
}
// m thode de linterface MouseListener
public void mousePressed(MouseEvent e) {
last_x = e.getX( );
last_y = e.getY( );
}
Page 48
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Scribble : dessin dans une applet
....(suite)....
// m thode de linterface MouseMotionListener
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics( );
int x = e.getX( );
int y = e.getY( );
g.drawLine(last_x, last_y, x, y);
last_x = x;
last_y = y;
}
// m thodes inutilis es des Listeners
public void mouseReleased (MouseEvent e) { }
public void mouseClicked (MouseEvent e) { }
public void mouseEntered (MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mouseMoved(MouseEvent e) { }
}
Page 49
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Scribble : dessin dans une applet
Dans la page Web
<!-- Applet Scribble : code a inserer dans le chier HTML -->
<html>
<body>
<applet code=Scribble.class width=300 height=300> </applet>
</body>
</html>
Pour tester lapplet
appletviewer fichier-html
ou avec votre navigateur favori
Page 50
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Avec les classes imbriqu es
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Scribble extends JApplet {
private int last_x, last_y;
public void init( ) {
// ! NB: rajouter getContentpane(). avant Java 5 !
setBackground(Color.white);
// d finir, instancier et enregistrer le Listener
addMouseListener(
new MouseAdapter ( ) {
public void mousePressed(MouseEvent e) {
last_x = e.getX( );
last_y = e.getY( );
}
} );
Page 51
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Avec les classes imbriqu es
....(suite)....
addMouseMotionListener(
new MouseMotionAdapter ( ) {
public void mouseDragged(MouseEvent e) {
// m me code que dans la pr c dente version
....
}
} );
// ajouter un bouton qui efface tout
JButton b = new JButton("Clear");
add(b);
b.addActionListener(
new ActionListener ( ) {
public void actionPerformed(ActionEvent e) {
Graphics g = getGraphics( );
g.setColor(getBackground( ));
g.fillRect(0, 0, getSize( ).width, getSize( ).height);
}
} );
Page 52
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Persistance de laffichage
Probl mes de lexemple pr c dent
/ 1) laffichage du dessin nest pas persistant !
"/ il est effac si on d place une fen tre dessus, si on iconifie...
(en fait a d pend des plateformes)
/ 2) normalement les m thodes des listeners ne doivent pas dessiner
Page 53
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Persistance de laffichage
Probl mes de lexemple pr c dent
/ 1) laffichage du dessin nest pas persistant !
"/ il est effac si on d place une fen tre dessus, si on iconifie...
(en fait a d pend des plateformes)
/ 2) normalement les m thodes des listeners ne doivent pas dessiner
Solution
/ m moriser la liste des op rations graphiques dans une display list
/ r afficher le dessin quand le composant qui le contient est rafra chi
Page 54
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
R afficher le dessin (1)
Pour r afficher le dessin avec AWT
red finir la m thode paint()
Pour r afficher le dessin avec Swing
red finir la m thode paintComponent()
car paint() appelle paintComponent() puis paintBorder() puis paintChildren()
class Dessin extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
// ne pas oublier cette ligne !
....etc...
}
}
Page 55
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
R afficher le dessin (2)
Pour indiquer quil faut r afficher le dessin
repaint() dans les m thodes des Listeners
=> appel automatique de paint() quand on revient dans la boucle
de gestion des v nements
les repaint() sont compact s (un seul paint())
Page 56
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Divers
Divers
Appeler revalidate() dans certains cas de changements de taille
Taille des bords : getInsets()
Opacit des widgets
" certains composants sont opaques, dautres sont transparents
" setOpaque() => composant opaque (et plus rapide)
Page 57
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
JFileChooser
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter ("JPG & GIF Images",
"jpg", "gif"););
chooser.setFileFilter(filter);
// ouvre la bo te de dialogue et bloque linteraction (dialogue modal)
int returnVal = chooser.showOpenDialog(parent);
if (returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: "
+ chooser.getSelectedFile().getName());
}
Page 58
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Disposition spatiale
Les LayoutManagers
calculent automatiquement la disposition spatiale
des enfants des Containers
A chaque conteneur est associ un LayoutManager
qui d pend du type de conteneur
Publicité
qui peut tre chang par la m thode setLayout()
" conteneur.setLayout(unAutreLayoutManager)
Pour faire le calcul " la main"
viter sauf cas particuliers
" conteneur.setLayout(null)
Page 59
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Avantages des LayoutManagers
C'est plus simple
pas de calculs compliqu s programmer !
Page 60
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Avantages des LayoutManagers
C'est plus simple
pas de calculs compliqu s programmer !
Configurabilit
accessibilit : ind pendance par rapport aux tailles des polices
internationalisation : ind pendance par rapport la longueur du texte
" langues orientales : texte ~1/3 plus petit que l'anglais
" fran ais, allemand : texte ~1/3 plus grand que l'anglais
Page 61
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Avantages des LayoutManagers
C'est plus simple
pas de calculs compliqu s programmer !
Configurabilit
accessibilit : ind pendance par rapport aux tailles des polices
internationalisation : ind pendance par rapport la longueur du texte
" langues orientales : texte ~1/3 plus petit que l'anglais
" fran ais, allemand : texte ~1/3 plus grand que l'anglais
Adaptativit des interfaces
les composants graphiques se retaillent automatiquement
quand l'utilisateur retaille les fen tres
Page 62
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Principaux LayoutManagers
FlowLayout
/ d faut des JPanel
/ met les objets la suite comme un "flux textuel" dans une page
"/ de gauche droite puis la ligne
Page 63
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Principaux LayoutManagers
BorderLayout
/ d faut des JFrame et JDialog
/ retaille automatiquement les enfants du conteneur
/ disposition de type points cardinaux
"/ via constantes: BorderLayout.CENTER, EAST, NORTH, SOUTH, WEST
Page 64
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Principaux LayoutManagers (2)
GridLayout
/ divise le conteneur en cellules de m me taille (grille virtuelle)
"/ de gauche droite et de haut en bas
/ retaille automatiquement les enfants
Page 65
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Principaux LayoutManagers (2)
GridBagLayout
/ grille + contraintes spatiales
"/ les enfants n'ont pas tous la m me taille
"/ sp cification par des
GridBagConstraints
Page 66
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Principaux LayoutManagers (3)
CardLayout
empile les enfants (et les met la m me taille)
usage typique: pour les onglets
BoxLayout
disposition verticale ou horizontale
exemple vu pr c demment :
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
SpringLayout
contraintes entre les bords des enfants
Page 67
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Autres toolkits graphiques Java
AWT Components
"Abstract Widget Toolkit"
plus ancien et moins puissant que Swing
attention: m me noms que Swing mais ... sans le J !
" exemple: JButton (Swing) et Button (AWT)
SWT
"Standard Widget Toolkit"
d velopp pour Eclipse
open source
m me type d'architecture que AWT
Page 68
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
AWT versus Swing
AWT
couche "abstraite" qui encapsule les widgets natifs de la plateforme
look & feel diff rent suivant l'OS
Swing
r impl mente tous les widgets en simulant les look & feel natifs
=> look & feel ind pendant de l'OS
=> comportement ( peu pr s) homog ne qq soit l'OS
architecture logicielle plus sophistiqu e
bien plus puissant !
Page 69
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Architecture Swing
Swing est inspir du mod le MVC
Model : donn es de l'application
View : repr sentation visuelle
Controller : gestion des entr es
source: enode.com
Page 70
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Architecture Swing
Swing est inspir du mod le MVC
Model : donn es de l'application
View : repr sentation visuelle
Controller : gestion des entr es
But de MVC
mieux structurer les applications
repr sentations multi-vues
" un mod le peut tre associ plusieurs vues
" la synchronisation est implicite
source: enode.com
Remarques
en pratique V est fortement li C
plusieurs variantes de MVC !
Page 71
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Architecture Swing (2)
"Separable Model Architecture"
View et Controller regroup s dans un UIComponent
Model : reste s par
"Pluggable Look and Feel"
chaque JComponent Swing encapsule un UIComponent
les UIComponent peuvent tre chang s dynamiquement par le UIManager
Page 72
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Architecture Swing (3)
Mod les et multi-vues
(la plupart des) JComponent Swing cr ent implicitement un Mod le
qui peut tre "export " et partag avec un autre JComponent
Exemple
JSlider et JScrollbar : m me mod le BoundedRangeModel
mise commun du mod le => synchronisation automatique
Page 73
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Exemple
Dans lAPI de JSlider et JScrollBar :
public BoundedRangeModel getModel();
public void setModel(BoundedRangeModel);
Changer le mod le du slider et du scrollbar :
JSlider slider = new JSlider();
BoundedRangeModel myModel = new DefaultBoundedRangeModel( ) {
public void setValue(int n) {
System.out.println(SetValue: + n);
super.setValue(n);
}
});
slider.setModel(myModel);
scrollbar.setModel(myModel);
On peut aussi ignorer lexistence des mod les :
JSlider slider = new JSlider();
int value = slider.getValue();
// coh rent car dans lAPI de JSlider :
public int getValue() {return getModel().getValue(); }
Page 74
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Pluggable Look and Feel
Java Metal
public static void main(String[ ] args) {
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }
//Create and show the GUI...
.....
}
Windows
UIManager.setLookAndFeel(
com.sun.java.swing.plaf.windows.WindowsLookAndFeel
);
Page 75
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Une variante de MVC
Page 76
Programmation v nementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
source: Sun