Vous êtes sur la page 1sur 38

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 support par Sun/Oracle ! SWT libre, initi par IBM / Eclipse ! tous (+ ou -) multi-plateformes

Swing repose sur AWT


! mais Swing != AWT ! ! JButton != Button !

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 : choix idpendants

JRadioButton : choix exclusif : voir ButtonGroup


Source: documentation Java Oracle

Page 5

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Texte

JTextField

JPasswordField JTextArea : texte simple multilignes ascenseur : voir 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

JTabbedPane: onglets JTree

JTable

Page 8

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Conteneurs spcifiques

JInternalFrame placer dans un JDesktopPane qui joue le rle de bureau virtuel JDesktopPane hrite de JLayeredPane

JLayeredPane permet de superposer des composants voir aussi JRootPane prsent plus loin

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 : ! 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 applets 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

Page 14

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Arbre dinstanciation
Arbre dinstanciation!
! arbre de liation des instances de composants graphiques"

Page 15

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Arbre dinstanciation
Chaque objet "contient" ses enfants!
! superposition : enfants afchs 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 liation 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 ! defaut pour JPanel : FlowLayout, pour JWindow : BorderLayout, etc.

Ne pas oublier dappeler


! frame.pack( ) ! frame.setVisible(true)
Page 18

// calcul rcursif des positions et des tailles // fait apparatre la fentre

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 { JButton button = null; public static void main(String argv[ ]) { BipBip toplevel = new BipBip(); } public BipBip() { button = new JButton ("Please Click Me !"); getContentPane().add(button); !!!! // en gris : ncesaire avant version 5 // en gris : optionnel // fenetre principale

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 (auto-initialise en Java contrairement C/C++) ! toplevel est une variable locale (ne peut tre auto-initialise en Java ! 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) observateurs(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 comme les Listeners de Java ! leurs mthodes servent alors 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 KeyEvent WindowEvent FocusEvent etc. appuyer, relacher, bouger la souris ... appuyer, relacher une touche clavier... fermeture des fentres .... focus clavier (= o vont les caractres taps au clavier)

Evnements de haut niveau


! ActionEvent ! TextEvent ! etc.
Page 25

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

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Evnements Java
Mthodes communes aux AWTEvent
! getSource() ! getID() objet producteur type dvnement (entier)

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 sous-classe dAWTEvent correspond un EventListener (en gnral)

Exemple : ActionEvent
! vnement : 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 :
! ! ! ! ! mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent)

! Listener : MouseMotionListener ! Mthodes :


! mouseDragged(MouseEvent) ! mouseMoved(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 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[ ]) { new BipBip(); } public BipBip() { button = new JButton ("Do It!"); add(button); // crer et associer un ActionListener Ecoute elc = new Ecoute(); button.addActionListener(elc); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } }
Page 30 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

class Ecoute implements ActionListener { // mthode appele quand on active le bouton public void actionPerformed(ActionEvent e) { System.out.println("Done!"); } }

Problme ?

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); // crer et associer un ActionListener Ecoute elc = new Ecoute(); button.addActionListener(elc); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } }
Page 31 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

class Ecoute implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Done!"); label.setText("Done!"); // ne compile pas ! } }

Problme : communication entre objets


! comment le Listener peut-il agir sur la partie graphique ?

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); // crer et associer un ActionListener Ecoute elc = new Ecoute(this); button.addActionListener(elc); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); } }
Page 32 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

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 rfrence vers la partie graphique ! solution flexible mais lourde...

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 multiplement 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[ ]) { new BipBip(); } public BipBip() { add(button = new JButton ("Do It")); 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);

Remarque
! actionPerformed() accs label car cest une mthode dinstance de BibBip

Autre problme ?
Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Page 34

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[ ]) { new BipBip(); } public BipBip() { add(button = new JButton ("Do It")); 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);

Problme : plusieurs boutons


! comment avoir plusieurs comportements avec un seul Listener ?

Page 35

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

public void actionPerformed(ActionEvent e) { if (e.getSource() == doIt) label.setText("Done!"); else if (e.getSource() == close) System.exit(0); } }

Solution
! distinguer les boutons grce ! getSource() ou ! getActionCommand() ! la 1ere solution est plus sre ! peu adapt si beaucoup de commandes

Avantages et inconvnients

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
Page 37

Version 2
! plus simple mais limit : on ne peut avoir qu'une seule mthode actionPerformed ! peu adapt si beaucoup de commandes

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Rappels sur l'envoi de messages


Appli EntryDialog

Envoi de message
! Appli veut envoyer un message EntryDialog (ex: pour modifier sa zone de texte)

Page 38

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Rappels sur l'envoi de messages


Appli EntryDialog

Dans tous les cas


! Appli doit conserver l'adresse d'EntryDialog ! typiquement via une variable d'instance (pas une variable de classe !)

Avec les langages typage statique (Java, C++, C#...)


! l'envoi de message se traduit par un appel de mthode !!Appli doit connatre le type d'EntryDialog et cette classe doit avoir la mthode adquate

Page 39

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Une possible implmentation

Pseudo hritage multiple des Listeners via implements


! comme dans Version 2 ! mme problme : solution limite, peu adapte si beaucoup de commandes

Page 40

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Une autre implmentation

Autant de Listeners que dactions effectuer


! comme dans Version 1 ! mme avantage : souplesse ! mme inconvnient : relative complexit

Page 41

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 ! attention : ce nest pas le cas en C++ !

Combinent les avantages des 2 solutions prcdentes


! souplesse sans la complexit

Page 42

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

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() { add(doIt = new JButton ("Do It")); add(close = new JButton ("Close")); class DoItListener implements ActionListener { public void actionPerformed(ActionEvent e) { label.setText("Done!"); } } class CloseListener implements ActionListener { public void actionPerformed(ActionEvent e) { System.exit(0); } } } // fin de la classe BibBip

doIt.addActionListener(new DoItListener( )); close.addActionListener(new CloseListener( )); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); }

Remarque
! actionPerformed() accs label car DoItListener est une classe imbrique de BibBip

Page 43

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Remarques
Remarques
! les classes imbriques peuvent galement servir encapsuler limplmentation ! le terme exact est plutt classes internes (inner classes en Anglais) ! il existe aussi des classes imbriques statiques = nested classes ! servent surtout structurer en sous-parties

Page 44

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 45

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 46

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); setVisible(BipBip.close); this.setVisible(close); BipBip.this.setVisible(close); } } // OK // FAUX : pas le bon !close! // ERREUR : pas le bon !this! // OK

Mme nom de variable dans classe imbriquante et classe imbrique !! 1) viter ! !! 2) prfixer par le nom de la classe
Page 47 Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Remarques sur les constructeurs


Un constructeur peut en appeler un autre
abstract class MyButton extends JButton implements ActionListener { public MyButton(String name, Icon icon) { super(name, icon);
} ........

public MyButton (String name) { this(name, null);


}

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

Page 48

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Remarques sur les constructeurs


Constructeur de classe
abstract class Toto { static { .......
}

// constructeur de classe

Remarques : ! sert effectuer des oprations sur les variables de classe ! nexiste pas en C++

Page 49

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 50

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 51

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 52

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 53

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 54

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 55 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 (en fait a dpend des plateformes) ! 2) normalement les mthodes des listeners ne doivent pas dessiner

Page 56

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 (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 rafraichi

Page 57

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Rafficher le dessin
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 !

Page 58

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Rafficher le dessin
Pour indiquer quil faut reafficher le dessin
! dans une mthode dun Listener il faut appeler repaint() ! les repaint() sont compacts : ! un seul raffichage mme si on appelle repaint() plusieurs fois

Page 59

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() => plus rapide

Page 60

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

JFileChooser
JFileChooser chooser = new JFileChooser(); ExampleFileFilter filter = new ExampleFileFilter(); filter.addExtension("jpg"); filter.addExtension("gif"); filter.setDescription("JPG & GIF Images"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(parent); if (returnVal == JFileChooser.APPROVE_OPTION) { System.out.println("You chose to open this file: " + chooser.getSelectedFile().getName()); }

Page 61

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(autreLayoutManager)

Pour faire le calcul " la main"


! viter sauf cas particuliers
! conteneur.setLayout(null)

Page 62

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 63

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

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

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

Page 65

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 66

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 67

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 68 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 ! la synchronisation est implicite
source: enode.com

!! Remarques
! en pratique, V est fortement li C ! il existe des variantes de MVC !
Page 69 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 70

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 71 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 72 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 73

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech

Une variante de MVC

source: Sun

Page 74

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


! UE INF222 : Modles et vrification ! UE INF355 : Paradigmes et langages non classiques ! UE INFSI351: Interfaces Homme-Machine, conception, visualisation, Flash, rendu/manipulation des images

Page 76

Programmation vnementielle et interfaces graphiques - Eric Lecolinet Telecom ParisTech