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