Académique Documents
Professionnel Documents
Culture Documents
Page 1
Page 2
Composants Swing
Page 3
Interacteurs
Page 4
Boutons
JButton
Page 5
Texte
JTextField
Page 6
Conteneurs
...
Page 7
Conteneurs
JToolBar: barre doutils
JTable
Page 8
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
Fentres
Page 10
Fentres
JRootPane implicitement cr
! par JApplet, JDialog, JFrame ! et JInternalFrame
Page 11
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
Attention
! restrictions diverses (accs aux fichiers, sockets...) pour des raisons de scurit
Page 13
Menus
Page 14
Arbre dinstanciation
Arbre dinstanciation!
! arbre de liation des instances de composants graphiques"
Page 15
Arbre dinstanciation
Chaque objet "contient" ses enfants!
! superposition : enfants afchs au dessus des parents" ! clipping : enfants #dcoups# : ne dpassent pas des parents"
Page 16
Arbre dinstanciation
Attention : ne pas confondre avec larbre dhritage !!
! arbre dinstanciation = arbre de liation des instances" ! arbre dhritage = hirarchie des classes"
Page 17
Arbre dinstanciation
Objet de plus haut niveau de larbre
! JFrame ou JApplet
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
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
Evnements
Evnements
! envoys lapplication cible ! chaque action lmentaire de lutilisateur
Page 21
Lance automatiquement
! la fin de la fonction main() dans le cas de Java
Page 22
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
Page 24
Evnements Java
Evnements AWT et Swing
! objets correspondant des catgories dvenements ! les principaux hritent de java.awt.event.AWTEvent
activer un bouton, un champ textuel ... abstraction des vnements de bas niveau modification du texte entr
Evnements Java
Mthodes communes aux AWTEvent
! getSource() ! getID() objet producteur type dvnement (entier)
Page 26
Observateurs dvnements
Event Listeners
! chaque sous-classe dAWTEvent correspond un EventListener (en gnral)
Exemple : ActionEvent
! vnement : ActionEvent ! listener : ActionListener ! mthode : actionPerformed(ActionEvent)
Page 27
Observateurs dvnements
Exemple : MouseEvent
! Evnement : MouseEvent ! Listener : MouseListener ! Mthodes :
! ! ! ! ! mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent)
Remarque
! toutes les mthodes doivent tre implmentes ! car les Listeners sont des interfaces (au sens du langage Java)
Page 28
Page 29
Exemple : version 1
import javax.swing.*; import java.awt.event.*; public class BipBip extends JFrame { JButton button; public static void main(String argv[ ]) { new BipBip(); } public BipBip() { 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 ! } }
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
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
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
Page 35
Exemple : version 2
import javax.swing.*; import java.awt.event.*; public class BipBip extends JFrame implements ActionListener { JButton doIt, close; JLabel label = new JLabel(); public static void main(String argv[ ]) { new BipBip(); } public BipBip() { add(doIt = new JButton ("Do It")); add(close = new JButton ("Close")); doIt.addActionListener(this); close.addActionListener(this); setDefaultCloseOperation(EXIT_ON_CLOSE); pack(); setVisible(true); }
Page 36 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
Envoi de message
! Appli veut envoyer un message EntryDialog (ex: pour modifier sa zone de texte)
Page 38
Page 39
Page 40
Page 41
Page 42
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
Remarque
! actionPerformed() accs label car DoItListener est une classe imbrique de BibBip
Page 43
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
Page 45
Page 46
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 : ! pas possible en C++ (sauf pour C++11) ! par contre C++ accepte les paramtres par dfaut
Page 48
// constructeur de classe
Remarques : ! sert effectuer des oprations sur les variables de classe ! nexiste pas en C++
Page 49
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
// mthode de linterface MouseListener public void mousePressed(MouseEvent e) { last_x = e.getX( ); last_y = e.getY( );
}
Page 51
// 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
Page 53
Page 54
// 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
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
Rafficher le dessin
Pour rafficher le dessin avec AWT
! redfinir la mthode paint()
Page 58
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
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
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
Disposition spatiale
Les LayoutManagers
! calculent automatiquement ! la disposition spatiale des enfants des Containers
Page 62
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 63
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
GridBagLayout
! grille + contraintes spatiales
! les enfants n'ont pas tous la mme taille ! spcification par des GridBagConstraints
Page 65
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
SWT
! "Standard Widget Toolkit" ! dvelopp pour Eclipse ! open source ! mme type d'architecture que AWT
Page 67
!! 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 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
Page 70
!! 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
Page 73
source: Sun
Page 74
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
Page 76