Vous êtes sur la page 1sur 110

Une interface graphique en Java est un assemblage conteneurs (Container) et de composants (Component).

Un composant est une partie "visible" de l'interface utilisateur Java.


Cest une sous-classes de la classe abstraite java.awt.Component. Exemple : les boutons, les zones de textes ou de dessin, etc.

Un conteneur est un espace dans lequel on peut positionner plusieurs composants.


Sous-classe de la classe java.awt.Container La classe Container est elle-mme une sous-classe de la classe Component Par exemple les fentres, les applets, etc.

AWT et Swing

Object
(from la ng)

Button

Hirarchie dhritage des principaux lments des interfaces graphiques en Java

Canvas

Component

Ch eckbox Container Choice

Label

Panel List

W indow

Scrollbar

Dial og TextComponent Applet


(fro m ap pl et)

Frame

TextArea

TextField

FileDialog

AWT et Swing

Les deux conteneurs les plus courants sont le Frame et le Panel. Un Frame reprsente une fentre de haut niveau avec un titre, une bordure et des angles de redimensionnement.
La plupart des applications utilisent au moins un Frame comme point de dpart de leur interface graphique.

Un Panel n'a pas une apparence propre et ne peut pas tre utilis comme fentre autonome.
Les Panels sont crs et ajouts aux autres conteneurs de la mme faon que les composants tels que les boutons Les Panels peuvent ensuite redfinir une prsentation qui leur soit propre pour contenir eux-mmes d'autres composants.

AWT et Swing

On ajoute un composant dans un conteneur, avec la mthode add() :


Panel p = new Panel(); Button b = new Button(); p.add(b);

De manire similaire, un composant est retirer de son conteneur par la mthode remove() :
p.remove(b);

Un composant a (notamment) :
une taille prfre que lon obtient avec getPreferredSize() une taille minimum que lon obtient avec getMinimunSize() une taille maximum que lon obtient avec getMaximunSize()

AWT et Swing

import java.awt.*; public class EssaiFenetre1 { public static void main(String[] args) { Frame f =new Frame("Ma premire fentre"); Button b= new Button("coucou"); f.add(b); f.pack(); f.show(); } } Cration dune fentre (un objet de la classe Frame) avec un titre Cration du bouton ayant pour label coucou Ajout du bouton dans la fentre On demande la fentre de choisir la taille minimum avec pack() et de se rendre visible avec show()
AWT et Swing 6

A chaque conteneur est associ un gestionnaire de prsentation (layout manager) Le gestionnaire de prsentation gre le positionnement et le (re)dimensionnement des composants dun conteneur. Le r-agencement des composants dans un conteneur a lieu lors de :
la modification de sa taille, le changement de la taille ou le dplacement d'un des composants. l'ajout, l'affichage, la suppression ou le masquage d'un composant.

Les principaux gestionnaires de prsentation de l'AWT sont : FlowLayout, BorderLayout, GridLayout, CardLayout, GridBagLayout
AWT et Swing 7

Tout conteneur possde un gestionnaire de prsentation par dfaut.


Toute instance de Container rfrence une instance de LayoutManager. Il est possible d'en changer grce la mthode setLayout().

Les gestionnaires de prsentation par dfaut sont :


Le BorderLayout pour Window et ses descendants (Frame, Dialog, ) Le FlowLayout pour Panel et ses descendants (Applet, etc.)

Une fois install, un gestionnaire de prsentation fonctionne "tout seul" en interagissant avec le conteneur.
AWT et Swing 8

Le FlowLayout est le plus simple des managers de l'AWT Gestionnaire de prsentation utilis par dfaut dans les Panel si aucun LayoutManager n'est spcifi. Un FlowLayout peut spcifier :
une justification gauche, droite ou centre, un espacement horizontal ou vertical entre deux composants. Par dfaut, les composants sont centrs l'intrieur de la zone qui leur est alloue.

AWT et Swing

La stratgie de disposition du FlowLayout est la suivante :


Respecter la taille prfre de tous les composants contenus. Disposer autant de composants que l'on peut en faire tenir horizontalement l'intrieur de l'objet Container. Commencer une nouvelle range de composants si on ne peut pas les faire tenir sur une seule range. Si tous les composants ne peuvent pas tenir dans l'objet Container, ce n'est pas gr (c'est--dire que les composants peuvent ne pas apparatre).

AWT et Swing

10

OK

Ouvrir

Redimensionnement

OK

Ouvrir

Fermer

Fermer

plus visible

OK

Ouvrir

Redimensionnement

OK

Ouvrir

Fermer

Fermer

AWT et Swing

11

Redimensionnement

Redimensionnement

AWT et Swing

12

Redimensionnement

Redimensionnement

AWT et Swing

13

Le FlowLayout cache rellement et effectivement les composants qui ne rentrent pas dans le cadre. Le FlowLayout n'a d'intrt que quand il y a peu de composants. L'quivalent vertical du FlowLayout n'existe pas La prsentation FlowLayout positionne les composants ligne par ligne.
Chaque fois qu'une ligne est remplie, une nouvelle ligne est commence.

Le gestionnaire FlowLayout n'impose pas la taille des composants mais leur permet d'avoir la taille qu'ils prfrent.
AWT et Swing 14

BorderLayout divise son espace de travail en cinq zones gographiques : North, South, East, West et Center. Les composants sont ajouts par nom ces zones (un seul composant par zone).
Exemple add("North", new Button("Le bouton nord !")); Si une des zones de bordure ne contient rien, sa taille est 0.

AWT et Swing

15

Division de lespace avec le BorderLayout

NORTH

WEST

CENTER

EAST

SOUTH

AWT et Swing

16

import java.awt.*; public class EssaiBorderLayout extends Frame { private Button b1,b2,b3,b4, b5; public EssaiBorderLayout() { setLayout(new BorderLayout()); b1 = new Button ("Nord"); b2 = new Button ("Sud"); b3 = new Button ("Est"); b4 = new Button ("Ouest"); b5 = new Button ("Centre"); this.add(b1, BorderLayout.NORTH); this.add(b2 , BorderLayout.SOUTH); this.add(b3, BorderLayout.EAST); this.add(b4, BorderLayout.WEST); this.add(b5, BorderLayout.CENTER); } public static void main (String args []) { EssaiBorderLayout essai = new EssaiBorderLayout(); essai.pack (); essai.setVisible(true) ; }}

AWT et Swing

17

Stratgie de disposition du BorderLayout


S'il y a un composant dans la partie place dans la partie NORTH, NORTH il rcupre sa taille prfre, respecte sa hauteur prfre si possible et fixe sa largeur la totalit de la largeur disponible de l'objet Container. S'il y a un composant dans la partie place dans la partie SOUTH, NORTH. SOUTH il fait pareil que dans le cas de la partie NORTH S'il y a un composant dans la partie place dans la partie EAST EAST, il rcupre sa taille prfre respecte sa largeur prfre si prfre, possible et fixe sa hauteur la totalit de la hauteur encore disponible. S'il y a un composant dans la partie place dans la partie WEST, WEST il fait pareil que dans le cas de la partie EAST EAST. S'il y a un composant dans la partie CENTER il lui donne la CENTER, place qui reste, s'il en reste encore.

AWT et Swing

18

Lors du redimensionnement, le composant est lui-mme redimensionn en fonction de la taille de la zone, c--d :
les zones nord et sud sont ventuellement largies mais pas allonges. les zones est et ouest sont ventuellement allonges mais pas largies, la zone centrale est tire dans les deux sens.

AWT et Swing

19

N Redimensionnement O C S E O

AWT et Swing

20

Redimensionnement

Redimensionnement

AWT et Swing

21

Le GridLayout dispose les composants dans une grille.


Dcoupage de la zone d'affichage en lignes et en colonnes qui dfinissent des cellules de dimensions gales. Chaque composant la mme taille
quand ils sont ajouts dans les cellules le remplissage s effectue de gauche droite et de haut en bas.

Les 2 paramtres sont les ranges et les colonnes. Construction d'un GridLayout : new GridLayout(3,2);
nombre de lignes nombre de colonnes

AWT et Swing

22

import java.awt.*; public class AppliGridLayout extends Frame { public AppliGridLayout() { super("AppliGridLayout"); this.setLayout(new GridLayout(3,2)); for (int i = 1; i < 7; i++) add(new Button(Integer.toString(i))); this.pack(); this.show(); } public static void main(String args[]) { AppliGridLayout appli = new AppliGridLayout(); } }

AWT et Swing

23

Lors dun redimensionnement les composants changent tous de taille mais leurs positions relatives ne changent pas.

1 3 5

2 4 6

Redimensionnement

1 3 5

2 4 6

AWT et Swing

24

Redimensionnement

AWT et Swing

25

Le CardLayout n'affiche qu'un composant la fois :


les composants sont considres comme empiles, la faon d'un tas de cartes.

La prsentation CardLayout permet plusieurs composants de partager le mme espace d'affichage de telle sorte que seul l'un d'entre eux soit visible la fois. Pour ajouter un composant un conteneur utilisant un CardLayout il faut utiliser add(String cle, Component monComposant) Permet de passer de l affichage d un composant un autre en appelant les mthodes first, last, next, previous ou show
AWT et Swing 26

Le gestionnaire GridBagLayout fournit des fonctions de prsentation complexes


bases sur une grille dont les lignes et les colonnes sont de taille variables. permet des composants simples de prendre leur taille prfre au sein d'une cellule, au lieu de remplir toute la cellule. permet aussi l'extension d'un mme composant sur plusieurs cellules.

Le GridBagLayout est compliqu grer.


Dans la plupart des cas, il est possible dviter de lutiliser en associant des objets Container utilisant des gestionnaires diffrents.

AWT et Swing

27

Le gestionnaire GridBagLayout est associ un objet GridBagConstraints


lobjet GridBagConstraints dfinit des contraintes de positionnement, dalignements, de taille, etc. dun composant dans un conteneur gr par un GridBagLayout. GridBagLayout On associe chaque composant que lon place dans le GridBagLayout avec un objet GridBagConstraints
Un mme objet GridBagConstraints peut-tre associ plusieurs composants. Dfinir les objets GridBagConstraints en spcifiant les diffrents paramtres est assez fastidieux Voir la doc

AWT et Swing

28

super("AppliComplexeLayout"); setLayout(new BorderLayout()); Panel pnorth = new Panel(); pnorth.add(b1); pnorth.add(b2); pnorth.add(b3); pnorth.add(b4); this.add(pnorth,BorderLayout.NORTH); Panel pcenter = new Panel(); pcenter.setLayout(new GridLayout(2,2)); pcenter.add(gr1); pcenter.add(gr2); pcenter.add(gr3); pcenter.add(gr4); this.add(pcenter,BorderLayout.CENTER); Panel psouth = new Panel(); psouth.setLayout(new FlowLayout()); psouth.add(ch); psouth.add(tf); this.add(psouth, BorderLayout.SOUTH);

AWT et Swing

29

On peut imposer un objet container de navoir pas de gestionnaire en fixant son LayoutManager la valeur null
Frame f = new Frame(); f.setLayout(null);

A la charge alors du programmeur de positionner chacun des composants manuellement en indiquant leur position absolue dans le repre de la fentre. Cest viter, sauf dans des cas particuliers,.

Il est possible dcrire ses propres LayoutManager

AWT et Swing

30

FlowLayout
Flux : composants placs les uns derrire les autres

BorderLayout
Ecran dcoup en 5 zones ( North , West , South , East , Center )

GridLayout
Grille : une case par composant, chaque case de la mme taille

CardLayout
Onglets : on affiche un lment la fois

GridBagLayout
Grille complexe : plusieurs cases par composant

AWT et Swing

31

L'utilisateur effectue
une action au niveau de l'interface utilisateur (clic souris, slection d'un item, etc) alors un vnement graphique est mis.

Lorsqu'un vnement se produit


il est reu par le composant avec lequel l'utilisateur interagit (par exemple un bouton, un curseur, un champ de texte, etc.). Ce composant transmet cet vnement un autre objet, un couteur qui possde une mthode pour traiter lvnement
cette mthode reoit lobjet vnement gnr de faon traiter l'interaction de l'utilisateur.

AWT et Swing

32

La gestion des vnements passe par l'utilisation d'objets "couteurs d'vnements" (les Listener) et d'objets sources d'vnements.
Un objet couteur est l'instance d'une classe implmentant l'interface EventListener (ou une interface fille). Une source d'vnements est un objet pouvant recenser des objets couteurs et leur envoyer des objets vnements.

Lorsqu'un vnement se produit,


la source d'vnements envoie un objet vnement correspondant tous ses couteurs. Les objets couteurs utilisent alors l'information contenue dans l'objet vnement pour dterminer leur rponse.

AWT et Swing

33

import java.awt.*; import java.awt.event.*; class MonAction implements ActionListener { public void actionPerformed (ActionEvent e) { System.out.println ("Une action a eu lieu") ;} } public class TestBouton { public TestBouton(){ Frame f = new Frame ("TestBouton"); Button b = new Button ("Cliquer ici"); f.add (b) ; f.pack (); f.setVisible (true) ; b.addActionListener (new MonAction ());} public static void main(String args[]) { TestBouton test = new TestBouton();} }
AWT et Swing 34

public class Composants extends Frame implements ActionListener{ ... addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { System.exit(0); } }); ... public void actionPerformed (ActionEvent e) { if(e.getSource()==binit/*bouton init*/) {... ...
AWT et Swing 35

Les couteurs sont des interfaces Donc une mme classe peut implmenter plusieurs interfaces couteur.
Par exemple une classe hritant de Frame implmentera les interfaces MouseMotionListener (pour les dplacements souris) et MouseListener (pour les clics souris).

Chaque composant de lAWT est conu pour tre la source dun ou plusieurs types d'vnements particuliers.
Cela se voit notamment grce la prsence dans la classe de composant d'une mthode nomme addXXXListener().

AWT et Swing

36

Lobjet vnement envoy aux couteurs et pass en paramtres des fonctions correspondantes peut contenir des paramtres intressants pour l'application.
Par exemple, getX() et getY() sur un MouseEvent retournent les coordonnes de la position du pointeur de la souris. Une information gnralement utile quelques soit le type dvnement est la source de cet vnement que lon obtient avec la mthode getSource().

AWT et Swing

37

AWT et Swing

38

Plusieurs types d'vnements sont dfinis dans le package java.awt.event. Pour chaque catgorie d'vnements, il existe une interface qui doit tre dfinie par toute classe souhaitant recevoir cette catgorie dvnements.
Cette interface exige aussi qu'une ou plusieurs mthodes soient dfinies. Ces mthodes sont appeles lorsque des vnements particuliers surviennent.

AWT et Swing

39

Catgorie Action Item Mouse Mouse

Nom de linterface ActionListener ItemListener MouseMotionListener MouseListener

Key

KeyListener

Focus

FocusListener

Mthodes actionPerformed (ActionEvent) itemStateChanged (ItemEvent) mouseDragged (MouseEvent) mouseMoved (MouseEvent) mousePressed (MouseEvent) mouseReleased (MouseEvent) mouseEntered (MouseEvent) (MouseEvent) mouseExited mouseClicked keyPressed (KeyEvent) keyReleased (KeyEvent) keyTyped (KeyEvent) focusGained (FocusEvent) focusLost (FocusEvent)

AWT et Swing

40

Adjustment Component

AdjustmentListener ComponentListener

Window

WindowListener

Container Text

ContainerListener TextListener

adjustmentValueChanged (AdjustmentEvent) componentMoved (ComponentEvent)componentHiddent (ComponentEvent)componentResize (ComponentEvent)componentShown (ComponentEvent) windowClosing (WindowEvent) windowOpened (WindowEvent) windowIconified (WindowEvent windowDeiconified (WindowEvent) windowClosed (WindowEvent) windowActivated (WindowEvent) windowDeactivated (WindowEvent) componentAdded (ContainerEvent) componentRemoved(ContainerEvent) textValueChanged (TextEvent)

AWT et Swing

41

ActionListener
Action (clic) sur un bouton, retour chariot dans une zone de texte, tic dhorloge (Objet Timer)

WindowListener
Fermeture, iconisation, etc. des fentres

TextListener
Changement de valeur dans une zone de texte

ItemListener
Slection dun item dans une liste

AWT et Swing

42

MouseListener
Clic, enfoncement/relchement des boutons de la souris, etc.

MouseMotionListener
Dplacement de la souris, drag&drop avec la souris, etc.

AdjustmentListener
Dplacement d'une chelle

ComponentListener
Savoir si un composant a t cach, affich

ContainerListener
Ajout d'un composant dans un Container

AWT et Swing

43

FocusListener
Pour savoir si un lment a le "focus"

KeyListener
Pour la gestion des vnements clavier

AWT et Swing

44

import java.awt.*; import java.awt.event.*; public class EssaiActionEvent1 extends Frame implements ActionListener { public static void main(String args[]) {EssaiActionEvent1 f= new EssaiActionEvent1();} public EssaiActionEvent1() { super("Utilisation dun ActionEvent"); Button b = new Button("action"); b.addActionListener(this); add(BorderLayout.CENTER,b);pack();show(); } public void actionPerformed( ActionEvent e ) { setTitle("bouton cliqu !"); }}

Implmentation de l'interface ActionListener On enregistre lcouteur devt action auprs de lobjet source "b" Lorsque l'on clique sur le bouton dans l interface, le titre de la fentre change

AWT et Swing

45

public class EssaiActionEvent2 extends Frame implements ActionListener { private Button b1,b2; public static void main(String args[]) {EssaiActionEvent2 f= new EssaiActionEvent2();} public EssaiActionEvent2(){ super("Utilisation dun ActionEvent"); b1 = new Button("action1"); b2 = new Button("action2"); b1.addActionListener(this); b2.addActionListener(this); add(BorderLayout.CENTER,b1); add(BorderLayout.SOUTH,b2); pack();show(); } public void actionPerformed( ActionEvent e ) { if (e.getSource() == b1) setTitle("action1 cliqu"); if (e.getSource() == b2) setTitle("action2 cliqu"); }}

Les 2 boutons ont le mme couteur (la fentre) e.getSource()" renvoie l'objet source de lvnement. On effectue un test sur les boutons (on compare les rfrences)

AWT et Swing

46

import java.awt.*; import java.awt.event.*; public class WinEvt extends Frame implements WindowListener { public static void main(String[] args) { WinEvt f= new WinEvt();} public WinEvt() { super("Cette fentre se ferme"); addWindowListener(this); pack();show();} public void windowOpened(WindowEvent e){} public void windowClosing(WindowEvent e) {System.exit(0);} public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e){} public void windowDeiconified(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} }

Implmenter cette interface impose limplmentation de bcp de mthodes La fentre est son propre couteur WindowClosing() est appel lorsque l'on clique sur la croix de la fentre "System.exit(0)" permet de quitter une application java
47

AWT et Swing

Les classes adapteur permettent une mise en uvre simple de l'coute d'vnements graphiques.
Ce sont des classes qui implmentent les couteurs d'vnements possdant le plus de mthodes, en dfinissant un corps vide pour chacune d'entre elles. Plutt que d'implmenter l'intgralit d'une interface dont une seule mthode est pertinente pour rsoudre un problme donn, une alternative est de sous-classer l'adapteur appropri et de redfinir juste les mthodes qui nous intressent.
Par exemple pour la gestion des vnements fentres...

AWT et Swing

48

Solution en implmentant linterface class Terminator implements WindowListener { public void windowClosing (WindowEvent e) {System.exit(0);} public void windowClosed (WindowEvent e) {} public void windowIconified (WindowEvent e) {} public void windowOpened (WindowEvent e) {} public void windowDeiconified (WindowEvent e) {} public void windowActivated (WindowEvent e) {} public void windowDeactivated (WindowEvent e) {} } Solution en utilisant un WindowAdapter class Terminator extends WindowAdapter { public void windowClosing (WindowEvent e) {System.exit(0);} }
AWT et Swing 49

Il existe 7 classes d'adapteurs (autant que d'interfaces d'couteurs possdant plus d'une mthode) :
ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter

AWT et Swing

50

En pratique, et notamment avec la classe WindowAdapter, on utilise trs souvent une classe anonyme

Frame f = new Frame("Ma fentre") f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });

AWT et Swing

51

Button Canvas (zone de dessin) Checkbox (case cocher) CheckboxGroup Label Choice (Slecteur) List Scrollbar (barre de dfilement) TextField (zone de saisie d1 ligne) TextArea (zone de saisie multilignes)

AWT et Swing

52

Button
C'est un composant d'interface utilisateur de base de type "appuyer pour activer". Il peut tre construit avec une tiquette de texte (un label) prcisant son rle l'utilisateur. Un objet de la classe Button est une source dActionEvent Les couteurs associs des objets de la classe Button doivent implmenter interface ActionListener Il ny a quune mthode dans linterface ActionListener, c est la mthode public void actionPerformed(ActionEvent e).
Button b = new Button ("Sample") ; add (b) ; b.addActionListener (...) ;
AWT et Swing 53

CheckBox
La case cocher fournit un dispositif d'entre "actif / inactif" accompagn d'une tiquette de texte. La slection ou la dselection est notifie par un ItemEvent un couteur implmentant linterface ItemListener.
la mthode getStateChange() de ItemEvent retourne une constante : ItemEvent.DESELECTED ou ItemEvent.SELECTED. le mthode getItem() de ItemEvent renvoie la chane contenant l'tiquette de la case cocher considre.
Checkbox one = new Checkbox("One", false); add(one); one.addItemListener(...);
AWT et Swing 54

CheckboxGroup
On peut regrouper des cases cocher dans un CheckboxGroup pour obtenir un comportement de type boutons radio
On ne peut slectionner quune seule case du groupe de cases cocher en mme temps. Slectionner une case fera que toute autre case prcdemment coche sera dslectionne
CheckboxGroup cbg = new CheckboxGroup(); Checkbox one = new Checkbox("One", cbg, false); ... add(one); ...

AWT et Swing

55

Choice
Ce composant propose une liste de choix.
On ajoute des lments dans lobjet Choice avec la mthode addItem(String nomItem).
La chane passe en paramtre sera la chane visible dans la liste

On rcupre la chane de caractre correspondant litem actuellement slectionn avec la mthode String getSelectedItem() Cet objet est source de ItemEvent, lcouteur correspondant tant un ItemListener Choice c = new Choice();
c.addItem("First"); c.addItem("Second"); ... c.addItemListener (...);
AWT et Swing 56

Label
Un Label affiche une seule ligne de texte (tiquette) non modifiable. En gnral, les tiquettes ne traitent pas d'vnements.
Label l = new Label ("Bonjour !"); add(l);

AWT et Swing

57

List
Un objet de la classe List permet de prsenter l'utilisateur plusieurs options de texte parmi lesquelles il peut slectionner un ou plusieurs lments. Source dActionEvent et dItemEvent mthode String getSelectedItem() et String[] getSelectedItems() pour rcuprer des items.
List l =new List (4, false); l.add("item1"); nombre d'items visibles (ici 4 lments seront visible en mme temps) slections multiples possibles ou non. Ici, avec la valeur false, non possible

AWT et Swing

58

TextField
Le champ de texte est un dispositif d'entre de texte sur une seule ligne. Il est source dActionEvent On peut dfinir un champ de texte comme tant ditable ou non. Mthodes void setText(String text) et String getText() pour mettre ou retirer du texte dans le TextField
TextField f = new TextField ("Une ligne seulement ...", 30); add(f);

Texte par dfaut mis dans le TextField

Nombre de caractres visibles dans le TextField


AWT et Swing 59

TextArea
La zone de texte est un dispositif d'entre de texte multi-lignes, multi-colonnes avec ventuellement la prsence ou non de scrollbars (barres de dfilement) horizontal et/ou vertical. Il peut tre ou non ditable. Mthode setText(), getText() et append() (pour ajouter du texte la fin d un texte existant dj dans le TextArea)
TextArea t = new TextArea ("Hello !", 4, 30,TextArea.SCROLLBARS_BOTH); add(t); Valeur constante prcisant la prsence ou labsence de scrollbar
60

Texte par dfaut mis dans le TextArea Nombre de lignes Nombre de colonnes (en nbre de caractres)
AWT et Swing

Menu :
menu droulant de base, qui peut tre ajoute une barre de menus (MenuBar) ou un autre menu. Les lments de ces menus sont
des MenuItem
ils sont rajouts un menu En rgle gnrale, ils sont associs un ActionListener.

des CheckBoxMenuItem, ie. des lments de menus cocher


ils permettent de proposer des slections de type "activ / dsactiv " dans un menu.

AWT et Swing

61

PopupMenu
des menus autonomes pouvant s'afficher instantanment sur un autre composant.
Ces menus doivent tre ajouts un composant parent (par exemple un Frame), grce la mthode add(...). Pour afficher un PopupMenu, il faut utiliser la mthode show(...).

AWT et Swing

62

Canvas
Il dfinit un espace vide
Sa taille par dfaut est zro par zro (Ne pas oublier de la modifier avec un setSize(...) ) et il na pas de couleur.
pour forcer un canvas (ou tout autre composant) avoir une certaine taille il faut redfinir les mthodes getMinimumSize() et getPreferredSize().

On peut capturer tous les vnements dans un Canvas.


Il peut donc tre associ de nombreux couteurs : KeyListener, MouseMotionListener, MouseListener. On lutilise en gnral pour dfinir une zone de dessin

AWT et Swing

63

class Ctrait extends Canvas implements MouseListener { Point pt; public Ctrait() { addMouseListener(this); } public void paint(Graphics g) {g.drawLine(0,0,pt.x,pt.y); g.setColor(Color.red); g.drawString("("+pt.x+";"+pt.y+")",pt.x,pt.y+5);} public Dimension getMinimumSize() {return new Dimension(200,100);} public Dimension getPreferredSize() {return getMinimumSize();} public void mouseClicked(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e) {pt=e.getPoint();repaint();} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){}}

AWT et Swing

64

import java.awt.*; import java.awt.event.*; public class Dessin extends Frame { public static void main(String[] args) { Dessin f= new Dessin(); } public Dessin() { super("Fentre de dessin"); Ctrait c= new Ctrait(); add(BorderLayout.CENTER,c); pack(); show(); } }

Utilisation de la classe prcdente (Ctrait) par une autre classe. Voir le fichier Dessin.java pour voir la manire exacte dont les 2 classes sont dfinies et utilises.

AWT et Swing

65

Contrle des couleurs d'un composant


Deux mthodes permettent de dfinir les couleurs d'un composant setForeground (Color c) : la couleur de lencre avec laquelle on
crira sur le composant setBackground (Color c) : la couleur du fond

Ces deux mthodes utilisent un argument instance de la classe java.awt.Color.


La gamme complte de couleurs prdfinies est liste dans la page de documentation relative la classe Color.

Il est aussi possible de crer une couleur spcifique (RGB)


int r = 255, g = 255, b = 0 ; Color c = new Color (r, g, b) ;

AWT et Swing

66

Contrle des polices de caractres


La police utilise pour afficher du texte dans un composant peut tre dfinie avec setFont(...) avec comme argument une instance de java.awt.Font.
Font f = new Font ("TimesRoman", Font.PLAIN, 14) ;

Les constantes de style de police sont en ralit des valeurs entires, parmi celles cites ci-aprs :
Font.BOLD Font.ITALIC Font.PLAIN Font.BOLD + Font.ITALIC

Les tailles en points doivent tre dfinies avec une valeur entire.

AWT et Swing

67

Dialog
Un objet Dialog ressemble un objet Frame mais ne sert qu' afficher des messages devant tre lus par l'utilisateur.
Il n'a pas de boutons permettant de le fermer ou de l'iconiser. On y associe habituellement un bouton de validation. Il est rutilisable pour afficher tous les messages au cours de l'excution d'un programme.

Un objet Dialog dpend d'un objet Frame (ou hritant de Frame)


ce Frame est pass comme premier argument au constructeur).

Un Dialog n'est pas visible lors de sa cration. Utiliser la mthode show() pour la rendre visible (il existe une mthode hide() pour la cacher).

AWT et Swing

68

FileDialog
Cest une sous-classe de Dialog ; par dfaut elle nest pas visible. C'est un dispositif de slection de fichier : on peut prciser si cest en vue dune sauvegarde ou du chargement dun fichier Un FileDialog ne gre gnralement pas d'vnements. Comme pour un objet Dialog, un FileDialog dpend dun objet Frame Un FileDialog est une fentre modale : partir du moment ou la fentre a t rendue visible par la mthode show(...), la main nest rendu lutilisateur que quand un fichier a t slectionn.

AWT et Swing

69

FileDialog

AWT et Swing

70

ScrollPane
C'est un conteneur gnral de type Panel
tout comme un Panel il ne peut pas tre utilis de faon indpendante il fournit des barres de dfilement (scrollbars) verticales et/ou horizontales

Un ScrollPane ne peut contenir qu'un seul composant Ce conteneur nest pas trs intressant mais est cit pour information.

Avec Swing que nous allons voir dans la suite, ne nouveaux trs intressants composants font leur apparition...

AWT et Swing

71

La bibliothque Swing est une nouvelle bibliothque de composants graphiques pour Java.
Swing est intgr Java 1.2. Swing peut tre tlcharg sparment pour une utilisation avec des versions de Java antrieures (1.1.5+)

Cette bibliothque s'ajoute celle qui tait utilise jusqu'alors (AWT) pour des raisons de compatibilit.
Swing fait cependant double emploi dans beaucoup de cas avec AWT. L'ambition de Sun est que, progressivement, les dveloppeurs ralisent toutes leurs interfaces avec Swing et laissent tomber les anciennes API graphiques.

AWT et Swing

73

Un composant graphique lourd (heavyweight GUI component) s'appuie sur le gestionnaire de fentres local, celui de la machine sur laquelle le programme s'excute.
awt ne comporte que des composants lourds. Ce choix technique a t initialement fait pour assurer la portabilit.

AWT et Swing

74

Exemple :
Un bouton de type java.awt.Button intgr dans une application Java sur la plate-forme Unix est reprsent grce un vrai bouton Motif (appel son pair - peer en anglais). Java communique avec ce bouton Motif en utilisant la Java Native Interface. Cette communication induit un cot. C'est pourquoi ce bouton est appel composant lourd.

AWT et Swing

75

Un composant graphique lger (en anglais, lightweight GUI component) est un composant graphique indpendant du gestionnaire de fentre local.
Un composant lger ressemble un composant du gestionnaire de fentre local mais n'en est pas un : un composant lger mule les composants de gestionnaire de fentre local. Un bouton lger est un rectangle dessin sur une zone de dessin qui contient une tiquette et ragit aux vnements souris. Tous les composants de Swing, excepts JApplet, JDialog, JFrame et JWindow sont des composants lgers.
AWT et Swing 76

Plus de composants, offrant plus de possibilits. Les composants Swing dpendent moins de la plate-forme :
Il est plus facile d'crire une application qui satisfasse au slogan "Write once, run everywhere" Swing peut pallier aux faiblesses (bogues ?) de chaque gestionnaire de fentre.

AWT et Swing

77

Les composants Swing sont situs dans le paquetage javax.swing et ses sous paquetages.
Un certain nombre de paquetages d'extensions du langage java 1.1 (par opposition aux paquetages standards java) sont regroups sous javax.
Cette convention permet de tlcharger ces paquetages dans un environnement navigateur avec une machine virtuelle java 1.1. Ces navigateurs ne sont, en effet, pas autoriss tlcharger des paquetages dont le nom commence par java java.

Ils portent des noms similaires leurs correspondants de AWT prcds d'un J.
JFrame, JPanel, JTextField, JButton, JCheckBox, JLabel, etc.

AWT et Swing

78

import java.awt.*; import javax.swing.*; public class MyApp extends JFrame { private JMenuBar barreMenus ; private JMenu couleur, dimensions ; private JMenuItem rouge, vert, hauteur, largeur ; public MyApp () { super("Une fenetre avec un menu") ; setSize(300, 200) ; //cration d'une barre de menu barreMenus = new JMenuBar() ; setJMenuBar(barreMenus) ; //ajout de la barre de menu dans la fentre //cration d'un menu Couleur et de ses options //Rouge etVert couleur = new JMenu("Couleur") ; barreMenus.add(couleur) ; rouge = new JMenuItem("Rouge") ; couleur.add(rouge) ; couleur.addSeparator() ; ;

//ajout d'une barre sparatrice avant l'option //suivante vert = new JMenuItem("Vert") ; couleur.add(vert) ; //cration d'un menu Dimensions et de ses //optionsHauteur et Largeur dimensions = new JMenu("Dimensions") ; barreMenus.add(dimensions) ; hauteur = new JMenuItem("Hauteur") ; dimensions.add(hauteur) ; dimensions.addSeparator() ; largeur = new JMenuItem("Largeur") ; dimensions.add(largeur) ; } public static void main(String args[]) { JFrame fen = new MyApp() ; fen.setVisible(true) ; } }

AWT et Swing

79

AWT et Swing

80

AWT et Swing

81

AWT et Swing

82

AWT et Swing

83

javax.swing
le paquetage gnral

javax.swing.border
pour dessiner des bordures autour des composants

javax.swing.colorchooser
classes et interfaces utilises par le composant JColorChooser

javax.swing.event
les vnements gnrs par les composants Swing

javax.swing.filechooser
classes et interfaces utilises par le composant JFileChooser

AWT et Swing

84

javax.swing.table
classes et interfaces pour grer les JTable

javax.swing.text
classes et interfaces pour la gestion des composants texte

javax.swing.tree
classes et interfaces pour grer les JTree

javax.swing.undo
pour la gestion de undo/redo dans une application

AWT et Swing

85

Anctre commun : classe JComponent


java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--javax.swing.JComponent

Le JFrame
Un objet JFrame a un comportement par dfaut associ une tentative de fermeture de la fentre.
Contrairement la classe Frame, qui ne ragissait pas par dfaut, l'action de fermeture sur un JFrame rend par dfaut la fentre invisible. Ce comportement par dfaut peut tre modifi par setDefaultCloseOperation().
AWT et Swing 86

4 comportements sont possibles lors de la fermeture de la fentre DO_NOTHING_ON_CLOSE HIDE_ON_CLOSE DISPOSE_ON_CLOSE EXIT_ON_CLOSE
import javax.swing.*; public class Simple { public static void main(String[] args) { JFrame cadre = new JFrame("Ma fenetre"); cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cadre.setSize(300, 200); cadre.setVisible(true); } dtermine que lapplication sera termine }

Lorsquon fermera la fentre


AWT et Swing

87

Le conteneur d'un JFrame n'est plus confondu avec le cadre lui-mme.


Il possde une couche de contenu, dans laquelle on peut ajouter les composants graphiques et dont on peut changer le gestionnaire de prsentation. Cette couche est obtenue par la mthode getContentPane();
Avec AWT Frame monFrame = new Frame ("Mon Frame"); Button monBouton = new Button ("Mon Bouton"); monFrame.add(monBouton);

Avec Swing JFrame monFrame = new JFrame ("Mon Frame"); JButton monBouton = new JButton ("Mon Bouton"); Container panneauContenu = monFrame.getContentPane(); panneauContenu.add(monBouton);
AWT et Swing 88

La classe ImageIcon et linterface Icon


Les objets de cette classe permettent de dfinir des icnes partir dimages (gif, jpg, etc.) qui peuvent tre ajouts au classique texte d'un JLabel, d'un JButton, etc.
Icon monIcone = new ImageIcon("Image.gif"); // Un JLabel JLabel monLabel = new JLabel("Mon Label"); monLabel.setIcon(monIcone); monLabel.setHorizontalAlignment(JLabel.RIGHT); // Un JButton JButton monBouton = new JButton("Mon bouton", monIcone);

AWT et Swing

89

JTextPane
un diteur de texte qui permet la gestion de texte format, le retour la ligne automatique (word wrap), l'affichage d'images.

JPasswordField
un champ de saisie de mots de passe : la saisie est invisible et l'affichage de chaque caractre tap est remplac par un caractre d'cho (* par dfaut).

JEditorPane
un JTextComponent pour afficher et diter du code HTML 3.2 et des formats tels que RTF.

AWT et Swing

90

import javax.swing.*; import java.awt.*; public class EditeurWEB { public static void main(String[] args) { JFrame monFrame = new JFrame ("Mon Frame"); monFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { JEditorPane monEditeur = new JEditorPane("http://www.google.fr"); Container panneauContenu = monFrame.getContentPane(); panneauContenu.setLayout(new FlowLayout()); panneauContenu.add(monEditeur); monFrame.pack(); monFrame.show();} catch (Exception e) {System.out.println(e.getMessage());}; } }

AWT et Swing

91

Des bordures peuvent tre dessines autour de tous composants graphiques. Swing en dfinit 9 types :
AbstractBorder : ne fait rien BevelBorder : une bordure 3D en surpaisseur ou en creux CompoundBorder : permet de composer des plusieurs bordures EmptyBorder EtchedBorder LineBorder : bordures d'une seule couleur) MatteBorder SoftBevelBorder : une bordure 3D aux coins arrondis TitledBorder : une bordure permettant l'inclusion dune chane de caractres

AWT et Swing

92

AWT et Swing

93

JLayeredPane
un conteneur qui permet de ranger ses composants en couches (ou transparents). Cela permet de dessiner les composants, selon un certain ordre: premier plan, plan mdian, arrire plan, etc. Pour ajouter un composant, il faut spcifier la couche sur laquelle il doit tre dessin
monJlayeredPane.add (monComposant, new Integer(5));

des layer sont dfinis en natif et des constantes pour y accder existent dans la classe.

AWT et Swing

94

ToolTipText
permet de crer des aides en lignes qui apparaissent lorsque la souris passe sur un composant.
JButton monBouton = new JButton ("Un bouton"); monBouton.setToolTipText ("Aide de mon bouton");

Reprsenter des listes : classe JList Reprsenter des arbres : classe JTree Reprsenter des tables (Excel) : classe JTable Ces quelques nouveauts ne sont qu'un aperu de ce que propose Swing.
Il y a beaucoup de composants, de nouveaux gestionnaires de prsentation, de nouveaux vnements graphiques que lon ne peut prsenter et dtailler dans le cadre de ce cours.

AWT et Swing

95

Rendu dclench par le systme


Le systme demande un composant de se peindre quand :
le composant est rendu visible pour la premire fois sur lcran le composant a t redimensionn le rendu du composant a t endommag et doit maintenant tre rpar (par exemple, quelque chose qui cachait une partie du composant a t dplac. Cette partie nouveau visible doit tre repeinte)

Rendu dclench par lapplication


Le composant dcide de se repeindre pour reflter un changement dans son tat interne
AWT et Swing 97

La demande de repeinte du composant


demande par lintermdiaire de la mthode public void paint (Graphics g)
quelle soit dclenche par le systme ou par lapplication

Donc le code indiquant ce quil faut peindre dans un composant doit tre place dans cette mthode (en la redfinissant)

AWT et Swing

98

Quand lAWT appelle cette mthode


lobjet Graphic est pr-configur avec un tat appropri pour dessiner sur ce composant particulier lobjet color de cet objet Graphic prend pour valeur celle du foreground du composant son objet font celle de la proprit font du composant son objet translation est fix de sorte que les coordonnes (0,0) reprsente le coin suprieur gauche du composant son objet clip rectangle est fix la zone qui a besoin dtre repeinte

AWT et Swing

99

De manire gnrale, il faut viter de placer du code servant pour le dessin/redessin des composants en dehors de la mthode paint()
pour viter que ce genre de code soit appel un moment inappropri (par exemple avant que le composant ne soit visible ou ait accs un objet Graphics valide)

AWT et Swing

10 0

Il faut galement viter dans un programme de faire un appel directe la mthode paint()
L AWT fournit un certain nombre de mthodes pour appeler la mthode paint() indirectement
public void public void public void public void repaint ( ) repaint (long tm) repaint (int x, int y, int width, int height) repaint (long tm, int x, int y, int width, int height)

AWT et Swing

10 1

Oprations ralises dans un rendu dclench par le systme


lAWT dtermine si le re-dessin concerne tout ou partie du composant lAWT appelle la mthode paint() sur le composant

AWT et Swing

10 2

Oprations ralises dans un rendu dclench par une application


le programme dtermine si le re-dessin concerne tout ou partie du composant en rponse un changement dtat interne le programme appelle repaint() sur le composant qui a besoin d tre repeint. lAWT provoque lappel de la mthode update() sur le composant si ce composant ne redfinit pas update(), limplmentation par dfaut dupdate() nettoie update() larrire plan du composant et appelle paint() .

AWT et Swing

10 3

pour rsumer (I)


Pour la majorit des programmes le code pour le rendu graphique du composant doit tre plac dans la mthode paint(). Les programmes peuvent faire dclencher un futur appel paint() en appelant repaint() mais ne doit gnralement pas appeler paint() directement. Sur des composants avec un rendu complexe, la mthode repaint() devrait tre invoque avec des arguments pour dfinir un rectangle de clipping

AWT et Swing

10 4

pour rsumer (II)


Un appel repaint() provoquant dabord un appel update(), qui est ensuite suivi d un appel paint() par dfaut, les composants lourds peuvent redfinir update() pour raliser du dessin incrmental (le dessin incrmental nest pas possible avec les composant lgers) Les classes drives de java.awt.Container qui redfinissent paint() devrait toujours invoquer dans le corps de cette mthode super.paint() pour sassurer que . tous ses composants sont redessins. Les composants avec un rendu graphique complexe devraient utilises le rectangle de clipping pour restreindre la zone redessiner

AWT et Swing

10 5

Comme pour lAWT, en Swing on va utiliser les mthodes paint() et repaint(). Swing supporte de plus quelques proprits additionnelles
le double buffering la transparence le chevauchement des composants

AWT et Swing

10 6

Pour tenir compte des spcificits des composants Swing, la mthode paint() va appeler 3 mthodes distinctes dans lordre suivant
protected void paintComponent(Graphics g) protected void paintBorder(Graphics g) protected void paintChildren(Graphics g)

Par consquent, un programme Swing devrait redfinir


paintComponent() et non paint() Gnralement, il nest pas ncessaire de redfinir les 2 autres mthodes.

AWT et Swing

10 7

AWT et Swing

10 8

Classe Principale : MyAppAWT

Classe Frame : MyFrameAWT Autres Classes pour la gestion des vnement MyActionListener
10 9

AWT et Swing

AWT et Swing

110