Vous êtes sur la page 1sur 39

Programmation vnementielle

& interfaces graphiques Java Swing

Eric Lecolinet
Tlcom Paristech Dept. INFRES
www.telecom-paristech.fr/~elc

Page 1 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Toolkits graphiques Java

Il y en a trois !
AWT Components, obsolte Swing repose sur AWT
Swing support par Oracle (autrefois Sun) mais Swing != AWT !
SWT libre, initi par IBM / Eclipse JButton != Button !
tous (+ ou -) multi-plateformes

Page 2 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Composants Swing

Source: documentation IBM

Page 3 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Interacteurs

Page 4 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Boutons

JButton JCheckbox : JRadioButton :


choix idpendants choix exclusif : cf. ButtonGroup

Source: documentation Java Oracle

Page 5 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Texte

JTextField

JPasswordField

JTextArea :
texte simple multilignes

Ascenseur :
cf. JScrollPane JEditorPane : texte avec styles
compatible HTML et RTF

Page 6 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Conteneurs

JPanel: conteneur gnrique

JScrollPane:
... avec ascenseurs intgrs

JSplitPane:
avec diviseur intgr

Page 7 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Conteneurs

JToolBar: barre doutils


(sous la barre de menus)

JTabbedPane:
onglets

JTree

JTable

Page 8 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Conteneurs spcifiques

JInternalFrame JLayeredPane permet de superposer


des composants
placer dans un JDesktopPane
qui joue le rle de bureau virtuel voir aussi JRootPane prsent plus loin

JDesktopPane hrite de JLayeredPane

Page 9 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Fentres

JFrame : fentre principale de lapplication

JDialog : fentre secondaire


normalement dpendante de la JFrame :
pas diconification spare, toujours au dessus de la JFrame
gnralement temporaire et modale ( transiente ):
bloque linteraction, impose lutilisateur de rpondre

Page 10 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Fentres

JRootPane implicitement cr
par JApplet, JDialog, JFrame
et JInternalFrame

Page 11 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Botes de dialogue prdfinies

JFileChooser JColorChooser

Particularit
peuvent tre crs :
comme composants internes
ou comme botes de dialogue

JOptionPane (multiples variantes)

Page 12 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Applets

Applet = composant de premier niveau


pour les applications dans pages Web

Attention
restrictions diverses (accs aux fichiers,
sockets...) pour des raisons de scurit

Page 13 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Menus

raccourci
clavier
(accelerator)

mnmonique

Page 14 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Arbre dinstanciation

Arbre dinstanciation
arbre de filiation des instances de composants graphiques

Page 15 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Arbre dinstanciation

Chaque objet graphique contient ses enfants


superposition : enfants affichs au dessus des parents
clipping : enfants dcoups : ne dpassent pas des parents

Page 16 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Arbre dinstanciation

Attention : ne pas confondre avec larbre dhritage !


arbre dinstanciation = arbre de filiation des instances
arbre dhritage = hirarchie des classes

Page 17 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Arbre dinstanciation

Objet de plus haut niveau de larbre


JFrame ou JApplet

Les conteneurs peuvent tre embots


en particulier les JPanels

Les layout managers assurent la disposition spatiale


un layout manager par conteneur
dfaut pour JPanel : FlowLayout, pour JWindow : BorderLayout, etc.

Ne pas oublier dappeler


frame.pack( ) // calcul rcursif des positions et des tailles
frame.setVisible(true) // fait apparatre la fentre

Page 18 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Exemple : version 0
// donne accs aux composants Swing
import javax.swing.*;

public class BipBip extends JFrame { // fentre 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 : ncessaire avant version 5

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Bib Bip");
pack(); // calcule la disposition spatiale
setVisible(true); // fait apparatre linterface
}
}

Page 19 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple : version 0

Notes et rappels
package javax.swing
une seule classe public par fichier, le fichier doit avoir le mme nom

button est une variable dinstance (on peut linitialiser contrairement C++)
toplevel est une variable locale

main() est une mthode de classe (cf. static)


les mthodes dinstance ont automatiquement accs aux variables dinstance
elles ont un paramtre cach this qui pointe sur linstance

getContentPane() ncesaire avant la version 5 cause du JRootPane


JWindow.add() a t redfini dans les versions ultrieure de Java

Page 20 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Evnements

Evnements
envoys lapplication cible
chaque action lmentaire de lutilisateur

Page 21 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Boucle de gestion des vnements

Boucle infinie qui


rcupre les vnements
appelle les fonctions de callback des composants graphiques

Lance automatiquement
la fin de la fonction main() dans le cas de Java

Page 22 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


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 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Application aux interfaces graphiques

Les observateurs dtectent les vnements


ce sont des fonctions de callback (en C, C++...)
ou des objets : Listeners en Java
leurs mthodes font office de fonctions de callback

Page 24 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Evnements Java

Evnements AWT et Swing


objets correspondant des catgories dvenements
les principaux hritent de java.awt.event.AWTEvent

Evnements de bas niveau


MouseEvent appuyer, relacher, bouger la souris ...
KeyEvent appuyer, relacher une touche clavier...
WindowEvent fermeture des fentres ....
FocusEvent focus clavier (= o vont les caractres taps au clavier)
etc.

Evnements de haut niveau


ActionEvent activer un bouton, un champ textuel ...
abstraction des vnements de bas niveau
TextEvent modification du texte entr
etc.

Page 25 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Evnements Java

Mthodes communes aux AWTEvent


getSource() objet producteur (Object)
getID() type dvnement (int)

Exemple: mthodes de MouseEvent


getX(), getY()
getClickCount()
getModifiers()
getWhen()
etc.

Page 26 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Observateurs dvnements

Event Listeners
chaque classe dvnement correspond une classe dEventListener
(en gnral)

Exemple : ActionEvent
Evnement : ActionEvent
Listener : ActionListener
Mthode : actionPerformed(ActionEvent)

Page 27 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Observateurs dvnements

Exemple : MouseEvent
Evnement : MouseEvent

Listener : MouseListener
Mthodes :
Listener : MouseMotionListener
mouseClicked(MouseEvent)
Mthodes :
mouseEntered(MouseEvent)
mouseDragged(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent) mouseMoved(MouseEvent)
mouseReleased(MouseEvent)

Remarque
toutes les mthodes doivent tre implmentes
car les Listeners sont des interfaces (au sens du langage Java)

Page 28 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Rendre les composants ractifs

Associer des Listeners aux composants graphiques


un composant peut avoir plusieurs listeners
un mme listener peut tre associ plusieurs composants

Page 29 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple : version 1
import javax.swing.*;
import java.awt.event.*;

public class BipBip extends JFrame {


JButton button;

public static void main(String argv[ ]) { class Ecoute implements ActionListener


{
new BipBip();
} // mthode appele quand on active le bouton
public void actionPerformed(ActionEvent e) {
public BipBip() { System.out.println("Done!");
button = new JButton ("Do It!"); }
add(button); }

// crer et associer un ActionListener


Ecoute elc = new Ecoute(); Problme ?
button.addActionListener(elc);

setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}

Page 30 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Exemple : version 1
import javax.swing.*;
import java.awt.event.*;

public class BipBip extends JFrame {


JButton button;
JLabel label = new JLabel();
class Ecoute implements ActionListener
public static void main(String argv[ ]) { {
new BipBip(); public void actionPerformed(ActionEvent e) {
} System.out.println("Done!");
label.setText("Done!"); // ne compile pas !
public BipBip() { }
button = new JButton ("Do It!"); }
add(button);

// crer et associer un ActionListener Problme :


Ecoute elc = new Ecoute(); communication entre objets
button.addActionListener(elc);
comment le Listener peut-il agir
setDefaultCloseOperation(EXIT_ON_CLOSE);
sur les composants graphiques ?
pack();
setVisible(true);
}
}
Page 31 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple : version 1
import javax.swing.*;
class Ecoute implements ActionListener {
import java.awt.event.*;
BipBip mainWin;
public class BipBip extends JFrame {
JButton button; public Ecoute (BipBip mainWin) {
JLabel label = new JLabel(); this.mainWin = mainWin;
}
public static void main(String argv[ ]) {
new BipBip(); public void actionPerformed(ActionEvent e) {
} System.out.println("Done!");
mainWin.label.setText("Done!");
public BipBip() {
}
button = new JButton ("Do It!");
add(button); }

// crer et associer un ActionListener


Ecoute elc = new Ecoute(this); Solution
button.addActionListener(elc); le Listener doit conserver une
setDefaultCloseOperation(EXIT_ON_CLOSE); rfrence vers la partie graphique
pack(); solution flexible mais lourde...
setVisible(true);
}
}
Page 32 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech
Objets hybrides

A la fois composant graphique et Listener


un seul objet => plus de problme de communication entre objets !
principe de lhritage multiple
simplifi dans le cas de Java : on ne peut hriter de faon multiple
que des spcifications (i.e. des interfaces)

Page 33 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple : version 2
import javax.swing.*;
import java.awt.event.*;

public class BipBip extends JFrame


implements ActionListener {
JButton button;
JLabel label = new JLabel();
public void actionPerformed(ActionEvent e) {
public static void main(String argv[ ]) { label.setText("Done!");
new BipBip(); }
}
} // fin de la classe BibBip
public BipBip() {
add(button = new JButton ("Do It"));
Remarque
// BibBip est la fois un JFrame et un Listener
button.addActionListener(this); actionPerformed() accs label
car cest une mthode dinstance
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack(); de BibBip
setVisible(true);
}
Autre problme ?

Page 34 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Exemple : version 2
import javax.swing.*;
import java.awt.event.*;

public class BipBip extends JFrame


implements ActionListener {
JButton button;
JLabel label = new JLabel();
public void actionPerformed(ActionEvent e) {
public static void main(String argv[ ]) { label.setText("Done!");
new BipBip(); }
}
} // fin de la classe BibBip
public BipBip() {
add(button = new JButton ("Do It"));

// BibBip est la fois un JFrame et un Listener Problme : plusieurs boutons


button.addActionListener(this);
comment avoir plusieurs
setDefaultCloseOperation(EXIT_ON_CLOSE); comportements avec
pack();
un seul Listener ?
setVisible(true);
}

Page 35 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple : version 2
import javax.swing.*;
import java.awt.event.*; public void actionPerformed(ActionEvent e) {
if (e.getSource() == doIt)
public class BipBip extends JFrame
implements ActionListener { label.setText("Done!");
JButton doIt, close; else if (e.getSource() == close)
JLabel label = new JLabel();
System.exit(0);
public static void main(String argv[ ]) { }
}
new BipBip();
}
Solution
public BipBip() {
distinguer les boutons grce
add(doIt = new JButton ("Do It"));
add(close = new JButton ("Close")); getSource() ou
getActionCommand()
doIt.addActionListener(this);
close.addActionListener(this); la 1ere solution est plus sre
setDefaultCloseOperation(EXIT_ON_CLOSE); peu adapt si beaucoup de
pack(); commandes
setVisible(true);
}

Page 36 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Avantages et inconvnients

Version 1 Version 2
plus souple : plus simple mais limit :
autant de listeners que l'on veut on ne peut avoir qu'une seule
mais lourd et peu concis : mthode actionPerformed()
on multiplie les objets et les lignes
peu adapt si beaucoup de
de code
commandes

Page 37 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

3eme solution : classes imbriques

Classes dfinies lintrieur dune autre classe


ont accs aux variables dinstance des classes qui les contiennent
remarque : ce nest pas le cas en C++ !

Combinent les avantages des 2 solutions


prcdentes
souplesse sans la lourdeur

Page 38 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Exemple : version 3
import javax.swing.*; class DoItListener implements ActionListener {
import java.awt.event.*; public void actionPerformed(ActionEvent e) {
label.setText("Done!");
BipBip extends JFrame { }
JButton doIt, close;
}
JLabel label = new JLabel();
class CloseListener implements ActionListener {
public static void main(String argv[ ]) {
new BipBip(); public void actionPerformed(ActionEvent e) {
} System.exit(0);
}
public BipBip() { }
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); actionPerformed() accs
pack(); label car DoItListener est une
setVisible(true);
} classe imbrique de BibBip

Page 39 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Synthse

Page 40 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Remarques

Remarques
les classes imbriques peuvent galement servir encapsuler limplmentation

le terme exact est classes internes (inner classes en Anglais)

il existe aussi des classes imbriques statiques = nested classes


pour structurer en sous-parties

Page 41 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Classes imbriques anonymes

Classes imbriques... 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 rfrence dans une mthode 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 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Mlanger les plaisirs !
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 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

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
}
}

Mme nom de variable dans classe imbriquante et classe imbrique


1) viter !
2) prfixer par le nom de la classe

Page 44 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


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 :


pas possible en C++ (sauf pour C++11)
par contre C++ accepte les paramtres par dfaut (pas Java)

Page 45 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Remarques sur les constructeurs

abstract class Toto {

static { // constructeur de classe


.......
}

Constructeur de classe
sert effectuer des oprations sur les variables de classe (initialisations)
nexiste pas en C++

Page 46 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Applets
Application
Programme indpendant
interprt par la commande java
Structure
hrite de JFrame (pour une GUI)
mthode main()
peut tre interface avec un autre langage (interfaces natives)

Applet (appliquette)
Programme pour navigateur Web
interprt par navigateur Web ou commande appletviewer
attention: restrictions daccs (fichiers, sockets ...)
Structure
hrite de JApplet
mthode init() (pas de new !)

Page 47 Programmation vnementielle 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);
}

// mthode de linterface MouseListener


public void mousePressed(MouseEvent e) {
last_x = e.getX( );
last_y = e.getY( );
}

Page 48 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Scribble : dessin dans une applet
....(suite)....

// mthode 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;
}

// mthodes inutilises 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 vnementielle 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 vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Avec les classes imbriques

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);

// dfinir, instancier et enregistrer le Listener


addMouseListener(
new MouseAdapter ( ) {
public void mousePressed(MouseEvent e) {
last_x = e.getX( );
last_y = e.getY( );
}
} );

Page 51 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avec les classes imbriques


....(suite)....

addMouseMotionListener(
new MouseMotionAdapter ( ) {
public void mouseDragged(MouseEvent e) {
// mme code que dans la prcdente 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 vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Persistance de laffichage

Problmes de lexemple prcdent


1) laffichage du dessin nest pas persistant !
il est effac si on dplace une fentre dessus, si on iconifie...
(en fait a dpend des plateformes)

2) normalement les mthodes des listeners ne doivent pas dessiner

Page 53 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Persistance de laffichage

Problmes de lexemple prcdent


1) laffichage du dessin nest pas persistant !
il est effac si on dplace une fentre dessus, si on iconifie...
(en fait a dpend des plateformes)

2) normalement les mthodes des listeners ne doivent pas dessiner

Solution
mmoriser la liste des oprations graphiques dans une display list
rafficher le dessin quand le composant qui le contient est rafrachi

Page 54 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Rafficher le dessin (1)

Pour rafficher le dessin avec AWT


redfinir la mthode paint()

Pour rafficher le dessin avec Swing


redfinir la mthode 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 vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Rafficher le dessin (2)

Pour indiquer quil faut rafficher le dessin


repaint() dans les mthodes des Listeners
=> appel automatique de paint() quand on revient dans la boucle
de gestion des vnements

les repaint() sont compacts (un seul paint())

Page 56 Programmation vnementielle 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 vnementielle 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 bote 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 vnementielle 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 dpend du type de conteneur
qui peut tre chang par la mthode setLayout()
conteneur.setLayout(unAutreLayoutManager)

Pour faire le calcul " la main"


viter sauf cas particuliers
conteneur.setLayout(null)

Page 59 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avantages des LayoutManagers

C'est plus simple


pas de calculs compliqus programmer !

Page 60 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Avantages des LayoutManagers

C'est plus simple


pas de calculs compliqus programmer !

Configurabilit
accessibilit : indpendance par rapport aux tailles des polices
internationalisation : indpendance par rapport la longueur du texte
langues orientales : texte ~1/3 plus petit que l'anglais
franais, allemand : texte ~1/3 plus grand que l'anglais

Page 61 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Avantages des LayoutManagers

C'est plus simple


pas de calculs compliqus programmer !

Configurabilit
accessibilit : indpendance par rapport aux tailles des polices
internationalisation : indpendance par rapport la longueur du texte
langues orientales : texte ~1/3 plus petit que l'anglais
franais, allemand : texte ~1/3 plus grand que l'anglais

Adaptativit des interfaces


les composants graphiques se retaillent automatiquement
quand l'utilisateur retaille les fentres

Page 62 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Principaux LayoutManagers

FlowLayout
dfaut des JPanel
met les objets la suite comme un "flux textuel" dans une page
de gauche droite puis la ligne

Page 63 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers

BorderLayout
dfaut 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 vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Principaux LayoutManagers (2)

GridLayout
divise le conteneur en cellules de mme taille (grille virtuelle)
de gauche droite et de haut en bas
retaille automatiquement les enfants

Page 65 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Principaux LayoutManagers (2)

GridBagLayout
grille + contraintes spatiales
les enfants n'ont pas tous la mme taille
spcification par des
GridBagConstraints

Page 66 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Principaux LayoutManagers (3)

CardLayout
empile les enfants (et les met la mme taille)
usage typique: pour les onglets

BoxLayout
disposition verticale ou horizontale
exemple vu prcdemment :
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

SpringLayout
contraintes entre les bords des enfants

Page 67 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Autres toolkits graphiques Java

AWT Components
"Abstract Widget Toolkit"
plus ancien et moins puissant que Swing
attention: mme noms que Swing mais ... sans le J !
exemple: JButton (Swing) et Button (AWT)

SWT
"Standard Widget Toolkit"
dvelopp pour Eclipse
open source
mme type d'architecture que AWT

Page 68 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


AWT versus Swing

AWT
couche "abstraite" qui encapsule les widgets natifs de la plateforme
look & feel diffrent suivant l'OS

Swing
rimplmente tous les widgets en simulant les look & feel natifs
=> look & feel indpendant de l'OS
=> comportement ( peu prs) homogne qq soit l'OS
architecture logicielle plus sophistique
bien plus puissant !

Page 69 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing

Swing est inspir du modle MVC


Model : donnes de l'application
View : reprsentation visuelle
Controller : gestion des entres

source: enode.com

Page 70 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Architecture Swing

Swing est inspir du modle MVC


Model : donnes de l'application
View : reprsentation visuelle
Controller : gestion des entres

But de MVC
mieux structurer les applications
reprsentations multi-vues
un modle peut tre associ plusieurs vues source: enode.com

la synchronisation est implicite

Remarques
en pratique V est fortement li C
plusieurs variantes de MVC !

Page 71 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Architecture Swing (2)

"Separable Model Architecture"


View et Controller regroups dans un UIComponent
Model : reste spar

"Pluggable Look and Feel"


chaque JComponent Swing encapsule un UIComponent
les UIComponent peuvent tre changs dynamiquement par le UIManager

Page 72 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Architecture Swing (3)

Modles et multi-vues
(la plupart des) JComponent Swing crent implicitement un Modle
qui peut tre "export" et partag avec un autre JComponent

Exemple
JSlider et JScrollbar : mme modle BoundedRangeModel
mise commun du modle => synchronisation automatique

Page 73 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Exemple
Dans lAPI de JSlider et JScrollBar :
public BoundedRangeModel getModel();
public void setModel(BoundedRangeModel);

Changer le modle 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 modles :


JSlider slider = new JSlider();
int value = slider.getValue();

// cohrent car dans lAPI de JSlider :


public int getValue() {return getModel().getValue(); }

Page 74 Programmation vnementielle 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 vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Une variante de MVC

source: Sun

Page 76 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech


Graphics2D

Couche graphique volue


plus sophistique que Graphics

Quelques caractristiques
systme de coordonnes indpendant du type de sortie (cran, imprimante)
et transformations affines : translations, rotations, homothties
package java.awt.geom
transparence
AlphaComposite, BITMASK , OPAQUE, TRANSLUCENT ...
Composition
Paths et Shapes
Fonts et Glyphs
etc... (voir dmo Java2D de Sun)

Page 77 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Pour en savoir plus

Site pdagogique de lUE INF224


http://www.telecom-paristech.fr/~elc/cours/inf224.html

Pour aller plus loin : UEs lies INF224


IGR201: Dveloppement d'applications interactives 2D, 3D, Mobile et Web

IGR203: Interaction Homme-Machine (ex: INFSI351)

SLR202 : Modlisation UML : vue structurelle et simulation comportementale

Page 78 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech