0% ont trouvé ce document utile (0 vote)
203 vues78 pages

Java Partie8 GUI

Transféré par

Wael Habboubi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
203 vues78 pages

Java Partie8 GUI

Transféré par

Wael Habboubi
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPT, PDF, TXT ou lisez en ligne sur Scribd

1

Programmation Oriente
Objet: Java
Sadok Ben Yahia, PhD
Facult des Sciences de Tunis
[email protected]
2
Plan
Introduction au monde Objet
La langage Java: Introduction et caractristiques
Syntaxe et structures de contrle
Hritage
Les exceptions
Les Entres/Sorties
Connexion Java et les bases de donnes: lAPI JDBC
Les Interfaces graphiques
3
Fentre dapplication
Toute fentre dapplication est reprsente par une classe drivant
ou utilisant la classe Frame du package java.awt
import java.awt.*;

public class MyFrame extends Frame {

final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
show();
}


public static void main(String[] args)
{
new MyFrame();
System.out.println("Coucou,
aprs le show");
}
}
se comporte comme toute fentre
du systme d exploitation :
peut tre redimensionne,
dplace,
mais ne peut tre pour linstant
ferme (ce comportement devra
tre programm par le concepteur
de la fentre)
affiche la fentre lcran
lance un thread d excution
pour grer interactions sur cette
fentre

l excution du programme principal se termine que lorsque le thread li
la fentre se termine lui aussi
4
Cration dun menu
Ajouter l application diteur graphique un menu rudimentaire
Fichier
Nouveau
Quitter
Aide
A propos
Classes utilises :
Menu : options visibles
dans la barre de menu
MenuItem :Items qui dclencheront par leur
slection des actions dfinies par le programmeur
MenuBar : reprsente la
barre de menu dune
fentre
5
Cration dun menu
import java.awt.*;

public class MenuEditeur extends MenuBar {
MenuItem quitter, nouveau, aPropos;

public MenuEditeur() {

Menu menuFichier = new Menu("Fichier");
nouveau = new MenuItem("Nouveau");
quitter = new MenuItem("Quitter");
menuFichier.add(nouveau);
menuFichier.addSeparator();
menuFichier.add(quitter);

Menu menuAide = new Menu("Aide");
aPropos = new MenuItem("A propos");
menuAide.add(aPropos);

this.add(menuFichier);
this.add(menuAide);
}

} // MenuEditeur
MenuBar : reprsente la barre de menu dune fentre
Menu : options visibles dans la barre de menu
MenuItem :Items qui dclencheront par leur
slection des actions dfinies par le programmeur
Fichier
Nouveau
Quitter
1) cration des
lments du menu
Fichier
Nouveau
Quitter
2) association des
objets MenuItem dans
un objet Menu
3) ajout des objets
Menu dans lobjet
MenuBar (this)
Fichier
Nouveau
Quitter
Aide
A propos
Classes utilises :
6
Insertion du menu dans la fentre
Seule une instance de la classe Frame peut hberger un menu
import java.awt.*;

public class MyFrame extends Frame {

final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);


show();
}


public static void main(String[] args)
{
new MyFrame();
}
}
setMenuBar(new MenuEditeur());
setMenuBar prend en paramtre une
instance de la classe MenuBar :
soit une instance directe de MenuBar
qui aura t modifie grce au
mthodes add()
soit une instance d une classe drive
de MenuBar comme dans le cas prsent

7
Structure de linterface graphique
Cration de linterface graphique passe forcment par une instance
de la classe Frame
Du point de vue du systme d exploitation cette fentre reprsente
l application
La fentre joue le rle de conteneur dans lequel vont tre
disposs les diffrents lments constitutifs (composants) de
l interface graphique de l application (boutons, listes droulantes,
zne de saisie)
ces lments dsigns sous les termes de
contrles (IHM)
composants (component en JAVA)
widgets (Xwindow-Motif)

8
Composants graphiques de AWT
Hirarchie de classes couvrant les composants de awt
Label
Button CheckBox Choice Canvas
List TextComponent Label ScrollBar
TextField TextArea
Checkbox
Button
TextField
Choice
List
Component
Classe abstraite
dcrit caractristiques
communes tous les
composants
Object
Container
Classe abstraite
composants pouvant
contenir dautres
composants
Window Panel
Frame Dialog
FileDialog
ScrollPane
Frame Panel
9
Composants graphiques de AWT
awt = Abstract Window Toolkit
conu dans un souci de portabilit d une plateforme lautre
conception pas toujours trs judicieuse dailleurs (cf les volutions de awt entre
version 1.0 et 1.1 de Java)
intersection des possibilits des diffrentes plateformes
seuls les composants standard existants dans tous les systmes d exploitation
peuvent tre prsent dans awt
palette de composants fournies par awt ne contient que des composants
simples

en 1997 Sun annonce les Java Fundation Classes (JFC) pour la cration
d interface graphiques plus labores
multiplication des composants plus riches en fonctionnalits (listes
arborescentes, grilles.)
ajout JDK 1.1 en tant que package externe
intgr Java 2 (JDK 1.2)
10
Java Fundation Classes
JFC : Java Fundation Classes
JFC = Swing + Java 2D API + copier coller inter-applications
Swing
Composants lgers (lightweight) 100% java
Prennent en charge leur affichage sans passer par des
objets Peers grs par le systme -> pas de code natif
aspect de l IHM : Motif, Windows, Mtal, Mac
modle MVC (Model View Controler)

Alors quel package utiliser : AWT ou Swing ???

Swing provides many benefits to programmers and end users.
Unless you have a good reason not to convert (and use AWT),
we urge you to convert to Swing as soon as possible.

M. Campione - K. Walrath the Java Tutorial

Puisqu elles le disent, allons-y
11
Conversion de awt vers Swing
La bibliothque Swing a t conue pour permettre une conversion
relativement aise des applications crites laide dawt (1.1)
import java.awt.*;

public class MyFrame extends Frame {

final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setMenuBar (new MenuEditeur());
show();
}


public static void main(String[] args)
{
new MyFrame();
}
}
import java.awt.*;

public class MenuEditeur extends MenuBar {
MenuItem quitter, nouveau, aPropos;

public MenuEditeur() {

Menu menuFichier = new Menu("Fichier");
nouveau = new MenuItem("Nouveau");
quitter = new MenuItem("Quitter");
menuFichier.add(nouveau);
menuFichier.addSeparator();
menuFichier.add(quitter);

Menu menuAide = new Menu("Aide");
aPropos = new MenuItem("A propos");
menuAide.add(aPropos);

this.add(menuFichier);
this.add(menuAide);
}

} // MenuEditeur
J
J
J
J J
J
J
J J
J
import javax.swing.*;
import javax.swing.*;
Dans bien des cas il suffit d ajouter un J au
nom des classes des composants awt
setJMenuBar
setVisible(true);
12
Ajout dun composant une fentre
import java.awt.*;

public class MyFrame extends Frame {

final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setMenuBar(new MenuEditeur());




show();
}

}
import javax.swing.*;

public class MyFrame extends JFrame {

final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setMenuBar(new MenuEditeur());

JButton b =
new JButton("Mon 1er composant");
this.getContentPane().add(b);

setVisible(true);
}

}
Un composant ne peut tre directement insr
dans une JFrame, mais son content pane
qui doit tre rcupr au pralable
1) Cration du composant
2) ajout au conteneur
Button b =
new Button("Mon 1er composant");
add(b);
Avec AWT Avec les Swings
13
Composants graphiques Swings
Hirarchie trs partielle des classes couvrant les
composants des swings
Classe abstraite
dcrit caractristiques
communes tous les
contrles Swings
JFrame
JWindow
JDialog
J Component
AbstractButton
Box
JButton JMenuItem JToggleButton
JColorChooser JLabel JPanel
JRadioButton JCheckBox
...
...
JMenu ...
Object
Container
Component
Window Panel
Frame Dialog
Button ...
awt
14
Imbrication des composants
Pour structurer linterface graphique utilisation de
JPanels
exemple : ajout d une barre doutils lditeur graphique
import java.awt.*;
import javax.swing.*;

public class BarreOutils extends JPanel {

public BarreOutils() {

String[] libelleCouleurs = {"Bleue",
"Rouge", "Jaune", "Vert"};

Color[] couleurs = { Color.blue,
Color.red, Color.yellow, Color.green };

this.setBackground(Color.lightGray);

JComboBox listeCouleurs = new JComboBox();
for (int i = 0; i < libelleCouleurs.length; i++)
listeCouleurs.addItem(libelleCouleurs[i]);

this.add(listeCouleurs);
this.add(new JButton("Dfaire"));
this.add(new JButton("Tout effacer"));
this.add(new JButton("Quitter"));
}

} // BarreOutils
import javax.swing.*;
Import java.awt.*;
public class MyFrame extends
JFrame {
final static int HAUTEUR = 200;
final static int LARGEUR = 300;

public MyFrame() {
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());
Container content
=this.getContentPane();
content.add(new BarreOutils());
setVisible(true);}
}
// ne pas oublier la methode main
JComboBox
JButton JPanel
15
Les lments d'un menu

classe JMenuBar
// Cette classe reprsente une barre de menu ou un groupe de menu.
JMenuBar() // Constructeur : cre une nouvelle barre de menus

JMenu
// Cette classe reprsente un menu qui peut tre insr sur une barre de
menu.
JMenu()
JMenu(String nomMenu)
JMenu(String nomMenu, Boolean b)
JMenu add(JMenuItem option) // ajoute une option de menu
JMenuItem add(String intitul) // ajoute une option dans le menu
void addSeparator(); // ajoute une ligne de sparation
classe JMenuItem
// Chaque lment d'un menu est reprsent par un objet MenuItem.
JMenuItem()
JMenuItem(String optionMenu)
JMenuItem(Icon icne)
JMenuItem(String optionMenu, Icon icne) // option avec texte et image
JMenuItem(String optionMenu, int mnemo) // option avec texte et touche
clavier
16
La classe JFrame
La Classe JFrame:

Elle reprsente une fentre principale qui possde un titre, une taille
modifiable et ventuellement un menu

Elle utilise un conteneur ou panneau de contenu (content pane) pour insrer
des composants (ils ne sont plus insres directement au JFrame mais
l'objet contentPane qui lui est associ).
17
La classe JFrame possde plusieurs constructeurs parmi lesquels on cite :
JFrame() : Constructeur par default
JFrame(String titre) : Cration dune instance en prcisant le Titre de la
fentre.

Parmi les mthodes de cette classe on cite :
setSize(int, int): permet de prciser les dimensions de ma Fentre.
setVisible (boolean) : par default la fentre est invisible, pour la rendre
visible on fait appel cette mthode.
setResizable(boolean): par default la fentre peut changer de
dimension. Pour la rendre fige on utilise cette mthode.

La classe JFrame
18
void addComponentListener(ComponentListener l)
void addFocusListener(FocusListener l)
void addKeyListener(KeyListener l)
void addMouseListener(MouseListener l)
void addMouseMotionListener(MouseMotionListener l)
Color getBackground()
Font getFont()
Color getForeground()
Point getLocation()
Dimension getSize()
boolean isEnabled()
boolean isShowing()
boolean isVisible()
void repaint()
void requestFocus()
void setBackground(Color c)
void setBounds(int x, int y, int width, int height)
void setEnabled()
void setFont(Font f)
void setForeground(Color c)
void setLocation(int x, int y)
void setLocation(Point p) void setSize(int width, int height) void setVisible(boolean cond)
La classe Jframe: Mthodes de la classe
Component
19
Principe de construction d'une fentre

20
void addWindowListener(WindowListener l)
Toolkit getToolkit() // Renvoie l'objet Toolkit associ la fentre
void pack() // remet en page l'ensemble des composants de la fentre
void show() // Rend la fentre visibleet/ou la place au premier plan
void toBack() //Place la fentre au dessous des autres fentres du bureau
void toFront() // Place la fentre au premier plan
La classe Jframe.
String getTitle()
boolean isResizable(boolean b)
void remove(MenuComponent m)
void setCursor(int cursorType)
void setlconlmage(Image image)
void setResizable(boolean resizable)
void setTitle(String title)
Les Mthodes de la classe Frame
Les Mthodes de la classe Window
21
JFrame
import javax.swing.*;

class MaFenetre extends JFrame {

public MaFenetre() {
super(" Ma premire Fenetre ");
setSize(200,100);
setVisible(true);
setSize(400,200);
}
public static void main(String [] args){
MaFenetre maFrame = new MaFenetre();
}
}
22
Le comportement par dfaut la fermeture

Il est possible de prciser comment un objet JFrame, JInternalFrame,
ou JDialog ragit sa fermeture grce la mthode
setDefaultCloseOperation().

Cette mthode attend en paramtre une valeur qui peut tre :
Constante Role
WindowConstants.DISPOSE_ON_CLOSE dtruit la fentre
WindowConstants.DO_NOTHING_ON_CLOSE rend le bouton de
fermeture inactif
WindowConstants.HIDE_ON_CLOSE cache la fentre
WindowConstants.EXIT_ON_CLOSE Quitte le programme
JFrame
23
Conteneur Rle
JPanel conteneur sans fentre propre. Utile pour ordonner les
contrles.
JWindow Fentre principale sans cadre ni menu. Les objets descendants
de cette classe peuvent servir implmenter des menus
JDialog raliser des botes de dialogue simples
JFrame classe de fentre compltement fonctionnelle
JApplet pas de menu. Pas de bote de dialogue sans tre incorpore
dans une classe Frame.
Rsum : Liste de Conteneurs
24
Placement des composants
Dans les exemples prcdents les composants se sont placs automatiquement
Pour la barre doutils au centre du JPanel
Mcanismes par dfaut
Possibilit de les adapter aux besoins particuliers de lapplication

LayoutManager objet associ un Container
se charge de grer la disposition des composants appartenant celui-ci
Par exemple Layout par dfaut pour les Jpanels
composants placs les uns aprs les autres dans leur ordre dajout
le tout doit tre centr
rordonnancement automatique des composants lorsque la fentre est redimensionne
25
Placement des composants
5 gestionnaires de mise en forme implmentant l interface LayoutManager sont
prdfinis dans awt :
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
North
South
West East Center
java.awt.BorderLayout

add(Component,String)
three
one
two
four
five
java.awt.FlowLayout

add(Component)
one
two
four
five
three
six
java.awt.GridLayout

add(Component, index)
Dautres sont dfinis dans les swings (BoxLayout, .)
Il est aussi possible de dfinir ses propres gestionnaires
26
Le FlowLayout
La classe FlowLayout (mise en page flot) place les composants ligne par
ligne de gauche droite. Chaque ligne est complte progressivement
jusqu' tre remplie, puis passe la suivante. Chaque ligne est centre
par dfaut. C'est la mise en page par dfaut des applets.

Il existe plusieurs constructeurs :
FlowLayout( )
FlowLayout( int align) : Permet de prciser l'alignement des
composants dans le conteneur (FlowLayout.CENTER,
FlowLayout.LEFT, FlowLayout.RIGHT ... ). Par dfaut, align vaut
CENTER
FlowLayout(int align, int hgap, int vgap) :Permet de prciser et
l'alignement horizontal et vertival dont la valeur par dfaut est 5.

27
Le FlowLayout
public MaFenetre() {
super("Ma premire Fenetre");
JButton b=new JButton();
JLabel l=new JLabel();
JTextField f=new JTextField();

b.setText("mon bouton");
l.setText("ma zone label");
f.setText("ali va au sook");

this.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 10,10));
this.getContentPane().add(b);
this.getContentPane().add(l);
this.getContentPane().add(f);

this.setDefaultCloseOperation
(DISPOSE_ON_CLOSE);
setVisible(true);
}

28
GridLayout
Dfinition de la barre d tat de l application
import javax.swing.*;
import java.awt.*;

public class BarreEtat extends JPanel {
private JLabel coord, info;

public BarreEtat() {
this.setBackground(Color.darkGray);
this.setLayout(new GridLayout(1,2));
this.add(info = new JLabel());
this.add(coord = new JLabel());
}

public void afficheCoord(int x, int y)
{
coord.setText("x : " + x + " y : " + y);
}

public void afficheInfo(String message)
{
info.setText(message);
}
}
Associe un GridLayout en
spcifiant le nombre de
lignes et colonnes
Ajout des composants dans
les diffrentes cellules
dfinies par le layout
29
BorderLayout
Avec ce Layout Manager, la disposition des composants est commande
par une mise en page en bordure qui dcoupe la surface en cinq zones :
North, South, East, West, Center. On peut librement utiliser une ou
plusieurs zones.

BorderLayout consacre tout l'espace du conteneur aux composants. Le
composant du milieu dispose de la place inutilise par les autres
composants.

Il existe plusieurs constructeurs :
BorderLayout( )
BorderLayout (int hgap,int vgap) Permet de prciser l'espacement
horizontal et vertical des composants.
30
BorderLayout
Ajout d une zone de dessin et d une barre d tat la fentre de lapplication
BarreOutils
North
BarreEtat
South
Zone dessin
Center
FlowLayout (par dfaut)
GridLayout (1 ligne, 2 colonnes)
ContentPane
BorderLayout

public MyFrame () {
BarreEtat barreEtat;
setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());
this.getContentPane().setLayout(new BorderLayout(2,2));
this.getContentPane().add(new BarreOutils(),"North");
this.getContentPane().add(new ZoneGraphique(),"Center");
this.getContentPane().add(barreEtat = new BarreEtat(),"South");
barreEtat.afficheCoord(0,0);
barreEtat.afficheInfo("coordonnes du curseur");

show();
}
Ajout des composants dans
les diffrentes rgions
dfinies par le layout
Associe un BorderLayout en
spcifiant espacement entre
les composants
31
Comment dimensionner les
composants ?
Jusqu prsent nous ne nous sommes pas proccups de la taille des
composants
Dans la barre doutils les boutons nont pas tous la mme taille (fixe
automatiquement par le layout manager).
Possibilit d indiquer une taille avec les mthodes setPreferredSize,
setMinimumSize.
public BarreOutils() {

JComboBox listeCouleurs;
String[] libelleCouleurs = {"Bleue", "Rouge", "Jaune", "Vert"};

Color[] couleurs = { Color.blue, Color.red, Color.yellow, Color.green };

this.setBackground(Color.lightGray);

listeCouleurs = new JComboBox();
for (int i = 0; i < libelleCouleurs.length; i++)
listeCouleurs.addItem(libelleCouleurs[i]);

this.add(listeCouleurs);
JButton b;
this.add(b= new JButton("Dfaire"));
b.setPreferredSize(new Dimension(130,25));
this.add(b = new JButton("Tout effacer"));
b.setPreferredSize(new Dimension(130,25));
this.add(b = new JButton("Quitter"));
b.setPreferredSize(new Dimension(130,25));
}
Indique les dimensions
souhaites, elles ne
pourront pas toujours
tre respectes selon les
contraintes et la
politique de placement
du LayoutManager
32
Comment dimensionner les
composants ?
Prise en compte des dimensions souhaites selon le layout
Layout

FlowLayout

BorderLayout (East, West)

BorderLayout (North, South)

BorderLayout(Center)

GridLayout
Hauteur

oui

non

oui

non

non
Largeur

oui

oui

non

non

non
Possibilit de se passer des services des LayoutManager et de placer les
composants la main en indiquant des positions et dimensions
exprimes en pixels (setBounds, setSize)
plus de souplesse
mais attention lorsque redimensionnement des conteneurs (attention la
portabilit de linterface graphique)
33
Grer les vnements
Pour le moment les interactions de l utilisateur avec les diffrents composants
de linterface graphique ne provoquent aucune action

Les applications comportant une interface graphique sont diriges par les
vnements (event-driven)
elles ne font rien jusqu' ce que l'utilisateur bouge la souris, clique un
bouton ou appuie sur une touche

Le coeur de toute application comportant une interface graphique est le code
de traitement des vnements.
un programme dirig par les vnements est structur autours d'un modle
de traitement des vnements. Bien comprendre ce modle est
important pour une bonne programmation.

dans JAVA , le modle de gestion des vnements a radicalement (et
heureusement) chang entre la version 1.0 et la version 1.1
34
Modle vnementiel du JDK 1.1
Objectifs de conception
simple et facile apprendre
sparation nette entre application et code de l'interface utilisateur
faciliter l'criture de code de gestion des vnements qui soit robuste
("strong compile time checking")
suffisamment flexible pour autoriser selon les applications des modles
diffrents pour le flot et la propagation des vnements
pour les concepteurs d'outils visuels permettre de dcouvrir l'excution
les vnements qu'un composant peut gnrer
les vnements qu'il peut observer
supporter une compatibilit binaire avec l'ancien modle

Ce nouveau modle est utilis par AWT, les Swings et sert galement aux
JAVA BEANS
35
Modle vnementiel du JDK 1.1
le modle vnementiel de JDK 1.1 se compose :
d'objets sources d'vnements
d'objets vnements
d'objets rcepteurs d'vnements

Ces objets interagissent de faon standard en invoquant des mthodes
pour permettre le dclanchement et la gestion des vnements
Activer
JButton
MonBouton
Source
d venments
ActionEvent
unEvnt
1
new ActionEvent( )
3
getSource()
unObjet
2
actionPerformed(unEvnt )
Rcepteur
d venments
36
Objets Evnement
Un objet vnement encapsule une information spcifique une instance
d'vnement
exemple : un vnement reprsentant un clic souris contient la position du
pointeur souris
Les diffrents types d'vnements sont reprsents par des classes diffrentes
ActionEvent, MouseEvent
Toute classe d'vnement est sous classe de la classe java.util.EventObject
Object
EventObject
EventObject(Object source)
Object getSource( )
AWTEvent
int id
MouseEvent
int getX(), int getY()
ActionEvent
String getCommand()
...
les diffrents types d'vnements
lis AWT hritent de AWTEvent
sont rangs dans le package
java.awt.event
Dfinit 7 types dvenments
MOUSE_CLICKED, MOUSE_DRAGGED
MOUSE_ENTERED, MOUSE_EXITED,
MOUSE_MOVED, MOUSE_PRESSED,
MOUSE_RELEASED
Permet d identifier plusieurs types
d vnements dans une mme classe
37
Rcepteurs dvnements
un rcepteur d'vnements est un objet qui doit tre prvenu (notified) par
la source lorsque certains vnements se produisent
les notifications d'vnements se font en invoquant des mthodes de
l'objet l'coute, l'objet vnement tant transmis en paramtre
la source d'vnements doit savoir quelle mthode du rcepteur doit tre
appele
pour chaque classe d'vnements une interface spcifique dfinit les
mthodes appeler pour notifier les vnements de cette classe
exemple : interface ActionListener pour les ActionEvents
toute classe dsirant recevoir des notifications d'un vnement donn
devra implmenter cette interface
un recepteur d ActionEvent doit implmenter la mthode
public void actionPerformed(ActionEvent e)
dfinie par l interface ActionListener
38
Interfaces
d coute d vnements
toutes les interfaces d coute d'vnements hritent de
java.util.EventListener
par convention toutes les interfaces des rcepteurs d'vnements ont des noms de
la forme <EventType>Listener
exemple : les vnements de AWT et les interfaces correspondantes pour les
rcepteurs
ActionEvent
AdjustmentEvent
ComponentEvent
ContainerEvent
FocusEvent
ItemEvent
KeyEvent
MouseEvent

TextEvent
WindowEvent
Classe d vnement
ActionListener
AdjustmentListener
ComponentListener
ContainerListener
FocusListener
ItemListener
KeyListener
MouseListener
MouseMotionListener
TextListener
WindowListener
Interface d coute
39
Interfaces
dcoute d vnements
Une interface d coute d'vnements peut contenir un nombre quelconque
de mthodes, chacune correspondant un vnement diffrent
MouseEvent dfinit 7 types
dvnements

MOUSE_CLICKED
MOUSE_ENTERED
MOUSE_EXITED
MOUSE_PRESSED
MOUSE_RELEASED


MOUSE_DRAGGED
MOUSE_MOVED
< interface >
MouseListener
void mouseClicked(MouseEvent)
void mouseEntered(MouseEvent)
void mouseExited(MouseEvent)
void mousePressed(MouseEvent)
void mouseReleased(MouseEvent)
< interface >
MouseMotionListener
void mouseMoved(MouseEvent)
void mouseDragged(MouseEvent)
Les mthodes dfinies dans les interfaces dcoute doivent se conformer au schma standard :
void <eventOccurenceMethodName>(<EventObjectType> evt);
o
eventOccurenceMethodName dcrit clairement l'vnement qui sera dclanch
EventObjectType est le type de l'vnement dclench et drive obligatoirement de
java.util.EventObject
40
Sources dvnements
vnements gnrs par des sources d'vnements (event sources)
source d'vnements, un objet capable de:
dterminer quand un vnement "intressant" s'est produit
d'avertir (notify) des objets rcepteurs (event listeners) de l'occurrence
de cet vnement

pour tre averti des vnements produits par une source un rcepteur doit
se faire enregistrer auprs de la source
Activer
JButton
MonBouton
Source
d venments
unObjet
Rcepteur
d venments
addActionListener(unObjet)
1
removeActionListener(unObjet)
4
2
actionPerformed(unEvnt )
...
3
actionPerformed(unEvnt )
41
Sources d vnements
Plusieurs rcepteurs peuvent tre lcoute d une mme source dvnements
Activer
JButton
MonBouton
Source
d venments
unObjet
Rcepteur
d venments
1
2
unAutreObjet
Rcepteur
d venments
3
4
5
lorsqu'un vnement se produit il se
dclenche vers tous les rcepteurs
d'vnements (multicast)
42
Sources dvnements
Un rcepteur peut tre l coute de plusieurs sources diffrentes
Activer
JButton
bouton1
Source
d venments
DesActiver
JButton
bouton2
Source
d venments
unObjet
Rcepteur
d venments
3
2
5
6
ActionEvent
unEvnt
new ActionEvent( )
4
ActionEvent
unEvnt
1
new ActionEvent( )
43
Sources dvnements
Une source d'vnements pour une interface dcoute d'vnements propose
une mthode d'enregistrement dont la signature a la forme suivante :
public void add<ListenerType>(<ListenerType> listener)

A tout moment un objet rcepteur d'vnements peut annuler sa demande de
notification

Une source d'vnements pour une interface rceptrice d'vnements propose
une mthode d'annulation de notification dont la signature a la forme suivante :
public void remove<ListenerType>(<ListenerType> listener)
44
Exemple de gestion
des vnements
Afficher les coordonnes de la souris lorsquelle se dplace sur la zne de
dessin.
Type d vnements : MouseEvent (MOUSE_MOVED, MOUSE_DRAGGED)
Source d vnements : la zne de dessin
Interface dcoute : MouseMotionListener
Recepteur d vnements ?
Devra modifier l affichage de la barre d tat
Plusieurs solutions sont possibles. Prenons le cas o le recepteur est la
zne graphique elle mme
elle devra senregistrer auprs delle mme pour tre l coute des
MouseMotionEvent gnrs sur elle
elle devra avoir connaissance de l objet grant la barre d tat (la
rfrence de celui-ci sera passe en paramtre du constructeur de la
zne graphique)
45
Exemple de gestion
des vnements
Code de la classe reprsentant la zone graphique
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ZoneGraphique extends JPanel implements MouseMotionListener {
private BarreEtat be;

public ZoneGraphique(BarreEtat be) {
setBackground(Color.white);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.be = be;
addMouseMotionListener(this);
}

public void mouseMoved(MouseEvent e) {
be.afficheCoord(e.getX(),e.getY());
}

public void mouseDragged(MouseEvent e) {
be.afficheCoord(e.getX(),e.getY());
}


} // ZoneGraphique
L objet zone graphique va tre
l coute des vnements
MouseEvent de type MouseMotion
1
L objet zone graphique utilise les
informations contenues dans l objet
MouseEvent qui lui est transmis pour
mettre jour la barre dtat.
2
L objet zone graphique s enregistre
lui mme comme rcepteur des
vnements MouseEvent de type
MouseMotion qu il est susceptible
de gnrer
3
46
Exemple de gestion
des vnements
Code de la classe lanant l application
import javax.swing.*;

public class MyFrame7 extends JFrame {
final static int HAUTEUR = 450;
final static int LARGEUR = 750;
public MyFrame7() {

BarreEtat barreEtat = new BarreEtat();

setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());

this.getContentPane().add(new BarreOutils(),"North");
this.getContentPane().add(new ZoneGraphique2(barreEtat),"Center");
this.getContentPane().add(barreEtat,"South");
barreEtat.afficheInfo("coordonnes du cruseur");

setVisible(true);
}


public static void main(String[] args)
{
new MyFrame7();
}

} // MyFrame
L objet zone graphique a
connaissance de l objet barre d tat
pour pouvoir agir sur lui lors de la
rception des MouseEvent
47
Pour rcapiltuler
Pour grer les vnements il faut :
identifier l objet l origine des vnements (souvent un composant)
identifier le type de l vnement que l on veut intercepter.
Pour dcouvrir les types d vnements quest capable d mettre un
composant lister dans sa classe toutes les mthodes de type
addXXXListener
crer une classe qui implmente l interface associe l vnement que
l on veut grer
le choix de cette classe n est pas neutre
celle du composant l origine de l vnement (facilit d implmentation)
une classe indpendante qui dtermine la frontire entre l interface
graphique (mission des vnements) et ce qui reprsente la logique de
l application (traitement des vnements). Une bonne sparation permet
de faciliter l volution du logiciel.
Implmenter dans cette classe la (les) mthode(s) associes
l vnement. Lvnement pass en paramtre contient des informations
qui peuvent tre utiles (position du curseur, tat du clavier, objet source de
l vnement).
48
WindowListener
Le cadre cr doit implmenter l'interface WindowListener et ainsi fournir
sept mthodes qui permettrons de manipuler les vnements associs
un cadre :
public void windowActivated(WindowEvent e)
public void windowClosed(WindowEvent e)
public void windowClosing(WindowEvent e)
// Fermeture du programme et de la machine virtuelle java
public void windowDeactivated(WindowEvent e)
public void windowDeiconified(WindowEvent e)
public void windowIconified(WindowEvent e)
public void windowOpened(WindowEvent e)

Tous les vnements ne nous intressent pas forcement dans chaque
application, la classe WindowAdapter permet de ne surcharger que les
mthodes dont on a besoin.
// gestion evenementielle de la fermeture de la fentre
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0);
}
} ) ;
49
Adaptateurs dvnements
Fermeture de la fentre
Code de l Editeur Graphique
import javax.swing.*;

public class EditeurGraphique extends Jframe {
final static int HAUTEUR = 450;
final static int LARGEUR = 750;
public EditeurGraphique {

BarreEtat barreEtat = new BarreEtat();

setTitle("Ma premire Fentre");
setSize(LARGEUR,HAUTEUR);
setJMenuBar(new MenuEditeur());

this.getContentPane().add(new BarreOutils(),"North");
this.getContentPane().add(new ZoneGraphique(barreEtat),"Center");
this.getContentPane().add(barreEtat,"South");
barreEtat.afficheInfo("coordonnes du cruseur");


show();
}


public static void main(String[] args)
{
new EditeurGraphique();
}

} // MyFrame
implements WindowListener {
this.addWindowListener(this);
L objet diteur graphique
s enregistre lui mme comme
rcepteur des WindowEvent quil
est susceptible de gnrer

2
L objet diteur graphique
va tre l coute des
vnements WindowEvent
1
Mais maintenant il faut aussi implmenter
les mthodes de l interface WindowListener
import java.awt.event.*;
50
Adaptateurs dvnements
Fermeture de la fentre
WINDOW_ACTIVATED
WINDOW_CLOSED
WINDOW_CLOSING
WINDOW_DEACTIVATED
WINDOW_DEICONIFIED
WINDOW_ICONIFIED
WINDOW_OPENED
WindowEvent
dfinit plusieurs
sous types
dvnements
windowActivated(WindowEvent)
Invoked when a window is activated
windowClosed(WindowEvent)
Invoked when a window has been closed.
windowClosing(WindowEvent)
Invoked when a window is in the process of being closed.
windowDeactivated(WindowEvent)
Invoked when a window is de-activated.
windowDeiconified(WindowEvent)
Invoked when a window is de-iconified.
windowIconified(WindowEvent)
Invoked when a window is iconified.
windowOpened(WindowEvent)
Invoked when a window has been opened.
WindowListener
WindowListener
dfinit plusieurs
mthodes, une pour
chacun de ces types
Dans le cas prsent seuls les vnements
WINDOW_CLOSING nous intressent
public class EditeurGraphique
implements WindowListener {

public EditeurGraphique() {

this.addWindowListener(this);
this.show();
}





public static void main(String[] args)
{ new EditeurGraphique();
}
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
Mais quand on implmente une interface il faut
implmenter toutes les mthodes quelle dfinit
public void windowActivated(WindowEvent e){;}
public void windowOpened(WindowEvent e){;}
...
corps vide
51
Adaptateurs dvnements
Fermeture de la fentre
Adaptateur dvnements
WindowAdapter dans
package java.awt.event
public class EditeurGraphique extends JFrame {

public EditeurGraphique() {

this.addWindowListener(new ClosingAdapter());
this.show();
}

public static void main(String[] args)
{ new EditeurGraphique();
}
}
public class ClosingAdapter extends
WindowAdapter {

public void windowClosing(WindowEvent e)
{
System.exit(0);
}

}
Etendre la classe WindowAdapter
implmenter que la mthode qui
nous concerne
52
Adaptateurs dvnements
Dessin des segments de droite
Gestion des vnements souris
Dplacement de la souris sur
la zone de dessin met jour
les coordonnes du curseur
dans la barre dtat
MOUSE_MOVED, MOUSE_DRAGGED
Appuyer sur un bouton de la
souris (MOUSE_PRESSED) dfinit
le dbut d une droite
Relacher le bouton de la
souris (MOUSE_RELEASED)
dfinit la fin de la droite
type d vnement MouseEvent
source : zone de dessin
interface d coute : MouseListener
rcepteur : zone de dessin
< interface >
MouseListener
void mouseClicked(MouseEvent)
void mouseEntered(MouseEvent)
void mouseExited(MouseEvent)
void mousePressed(MouseEvent)
void mouseReleased(MouseEvent)
Comme pour la fermeture de la
fentre seule deux des mthodes
de l interface nous intressent
53
Adaptateurs dvnements
Dessin des segments de droite
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ZoneGraphique extends JPanel
implements MouseMotionListener {
private BarreEtat be;

public ZoneGraphique(BarreEtat be) {
setBackground(Color.white);
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
this.be = be;
addMouseMotionListener(this);

}

public void mouseMoved(MouseEvent e) {
be.afficheCoord(e.getX(),e.getY());
}

public void mouseDragged(MouseEvent e) {
be.afficheCoord(e.getX(),e.getY());
}











} // ZoneGraphique
addMouseListener(new GestionnaireClic(this));
public void initieDroite(int x, int y) {
be.afficheMessage( Relacher pour dessiner la droite );
// on compltera ensuite
}
public void termineDroite(int x, int y) {
be.afficheMessage( Cliquer pour initier une droite );
// on compltera ensuite
}
import java.awt.event.*;

public class GestionnaireClic
extends MouseAdapter {








public void mousePressed(MouseEvent e)
{
zone.initieDroite(e.getX(),e.getY());
}

public void mouseReleased(MouseEvent e)
{
zone.termineDroite(e.getX(),e.getY());
}

}
Pour ne pas avoir dfinir des
mthodes inutiles possibilit
d utiliser un adaptateur
d vnements : MouseAdapter
ZoneGraphique zone;

public GestionnaireClic(ZoneGraphique z)
{
zone = z;
}
54
Des adaptateurs
aux classes internes
Gestion des boutons de la barre doutil
type d vnement ActionEvent
source les JButton
interface d coute ActionListener
rcepteur ?
Annule le dernier trac
Efface toute la zone de dessin
Lactivation des boutons doit se traduire par un changement dtat de la zone de dessin.
Il semble naturel que cela soit la zone dessin qui rcupre les vnements et ralise les traitement adquats.
55
le code zone
graphique dpend du
code de la barre
d outil.
Des adaptateurs
aux classes internes
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class ZoneGraphique extends JPanel
implements MouseMotionListener {
private BarreEtat be;

public ZoneGraphique(BarreEtat be) {
.
}

public void mouseMoved(MouseEvent e) { ... }
public void mouseDragged(MouseEvent e) { ... }

public void initieDroite(int x, int y) { ... }
public void termineDroite(int x, int y) { ... }











} // ZoneGraphique
public void efface() { ... }
public void annule() { ... }
1) Cest la zone
graphique qui
effectue les
traitements
dclenchs par
les boutons
efface et
annule
, ActionListener {
2) la zone graphique
reoit les vne-
ments issus des
boutons
public void actionPerformed(ActionEvent e)
{
selon l origine de lvnement
efface() ou annule()
}
Quid si on supprime
la barre d outil et
que toutes les
oprations
s effectuent via la
barre de menus ?

Lourdeur du code :
si beaucoup de
boutons couter
si plusieurs
moyens de
dclencher ces
actions (boutons,
menus)
56
Des adaptateurs
aux classes internes
Le modle vnementiel de JAVA 1.1 peut rapidement devenir difficile grer
si un objet doit tre l'coute d'un grand nombre d'objets sources,
il lui faut implmenter les interfaces avec chacun de ces objets
si un objet est l'coute d'vnements issus de deux objets (ou
d'avantage) sources d'vnements du mme type
l'objet rcepteur ne peut implmenter qu'une seule fois l'interface
rceptrice d'vnements, il lui faudra dcouvrir lui-mme quel objet
mis l'vnement
Cela peut conduire du code difficile lire et donc difficile crire
Une solution introduire un objet "mdiateur" entre la source d'vnements et le
rcepteur d'vnements
son rle : adapter la source aux besoins spcifiques d'o le nom
d'adaptateur d'vnements
57
Des adaptateurs
aux classes internes
import java.awt.event.*;
import java.awt.*;

public class AdaptateurEfface implements ActionListener
{
ZoneDessin zone;
public adaptateurEfface(ZoneDessin z) {
zone = z;
}
public void actionPerformed(ActionEvent e)
{
zone.efface();
}
}
import java.awt.event.*;
import java.awt.*;

public class AdaptateurAnnule implements ActionListener
{
ZoneDessin zone;
public AdaptateurEfface(ZoneDessin z) {
zone = z;
}

public void actionPerformed(ActionEvent e) {
zone.annule();
}
}
Adaptateurs d vnements
Simplification de ZoneDessin

Meilleur dcouplage des diffrents
lments de l interface utilisateur
Mais
multiplication du nombre de classes
classes pas vraiment rutilisables
Dans le code de BarreOutils
...
BarreOutils(ZoneDessin zd) {
...
JButton b;
this.add(b= new JButton("Dfaire"));
b.addActionListener(new AdaptateurAnnule(zd));
this.add(b = new JButton("Tout effacer"));
b.addActionListener(new AdaptateurEfface(zd));
...
}
...
58
Alors que faut-il faire ?


classes internes ou imbriques (inner classes)
possibilit de dfinir des classes lintrieur dautres classes
lune des volutions majeures de Java 1.1
si on limine les cas obscurs et pathologiques (D.
Flanagan in Java in a nutshell, 2nd Edition, O Reilly) c est
un ajout lgant et trs utile
utilisation trs frquente en particulier avec le nouveau
modle d vnements introduit aussi dans Java 1.1

Des adaptateurs
aux classes internes
59
Classes internes
Trois types de classes internes :
Classe membre : dfinition de la classe l intrieur d une classe, au mme
niveau que les attributs et mthodes
class X {
class Member extends Superclass {}
}
class X {
void work() {
class Local extends Superclass {}
}
}
Classe locale : dfinition de la classe l intrieur d une mthode
Classe anonyme :dfinition de la classe l intrieur d une expression
class X {
void work() {
obj = new Superclass() {}
}
}
class Anonymous extends/implements Superclass
60
Classes internes
classes membres
Classes membres
class X {
class Member extends Superclass {}
}

Toute instance d une classe membre est associe de manire interne une
instance de la classe englobante
accs implicite aux champs (attributs/mthodes) dfinis dans la(les) classe(s)
englobante(s), (y compris les champs privs)
exemple : (d aprs Java In a Nutshell, 2nd Edition, D. Flanagan, O Reilly)
public interface Linkable {
public Linkable getNext();
public void setNext(Linkable node);
}

public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}



}

public interface Iterator {
public boolean hasNext();
public Object next();
}

public Iterator iterator() {
...
}
Implmentation d une liste chane
Ajouter la liste chane la possibilit de parcourir
les lments laide dun Iterator
61
Classes internes
classes membres
public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}
public Iterator iterator() {
...
}
}

public class LinkedListIterator
implements Iterator {
private Linkable current;
private LinkedListe container;

public LinkedListIterator(LinkedList l) {
container = l;
current = container.head;
}
public boolean hasNext() {
return current != null;
}
public Object next() {
if(current == null)
throw NoSuchElementException(LinkedList);
Object value = current;
current = current.getNext();
return value
}
}
return new LinkedListIterator(this);
Ncessit de passer explicitement un
objet LinkedList dans le constructeur
Sans classe membre
public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}
public Iterator iterator() {
...
}



















}

private class LinkedListIterator implements Iterator{
private Linkable current;

public LinkedListIterator() {
current = head;
}
public boolean hasNext() {
return current != null;
}
public Object next() {
if(current == null)
throw NoSuchElementException(LinkedList);
Object value = current;
current = current.getNext();
return value
}
}

Avec une classe membre
return new LinkedListIterator();
Plus besoin de passer
lobjet LinkedList
dans le constructeur
head;
Accs direct aux membres (mme privs)
de la classe englobante
62
Classes internes
classes membres
Comment cela marche ?
Toute instance d une classe
membre est associe de manire
interne une instance de la
classe englobante
public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}
public Itrator iterator() {
return new LinkedListIterator();
}



















}

private class LinkedListIterator implements Iterator{
private Linkable current;

public LinkedListIterator() {
current = head;
}
public boolean hasNext() {
return current != null;
}
public Object next () {
if(current == null)
throw NoSuchElementException(LinkedList);
Object value = current;
current = current.getNext();
return value
}
}

le compilateur insre auto-
matiquement un attribut priv
pour contenir cette rfrence
1
le compilateur ajoute auto-
matiquement un argument cach
tous les constructeurs de la
classe membre 2
private LinkedList container;
1
(LinkedList l) {
2
(this);
3
3
et passe l objet contenant en
valeur de cet argument
63
Classes internes
classes membres
accs implicite aux champs (attributs/mthodes) dfinis dans la(les)
classe(s) englobante(s), (y compris les champs privs)
private class LinkedListIterator implements Iterator {
private Linkable current;

public LinkedListIterator() {
current = head;
}
...
}
public class LinkedList {
private Linkable head;
...










}
this.current = this.head; this.current = LinkedList.this.head;
Syntaxe pour faire rfrence
explicitement l instance contenante de
l instance courante de la classe membre
Pas d attribut head
dans la classe membre
64
Classes internes
classes membres
Hirarchie d imbrication et hirarchie dhritage sont totalement distinctes lune de
lautre
hritage : dfinit les champs (attributs, mthodes) dont hrite la classe membre
imbrication : dfinit les champs qui sont dans la porte (accessible) par la
classe membre.
import java.util.*;

public class C {
Vector a;
...
}
public class A {
int a;








}

class B extends C
{

}

Restrictions sur les classes membres
ne peuvent avoir un nom identique celui de l une des classes
englobantes
ne peuvent contenir de champs (attributs ou mthodes) static
En cas de conflit, le compilateur le signale :
Variable 'a' is inherited in inner class A. B, and hides a
variable of the same name in class A. An explicit 'this'
qualifier must be used to select the desired instance.

this.a est un Vector
A.this.a est un int
a ??
65
Classes internes
classes membres
Compilation de classes membres
La machine virtuelle JAVA n a pas t modifie pour la prise en compte des
classes internes
Le compilateur doit convertir les classes internes en classes standard (top-level
classes) que l interprteur JAVA peut comprendre
C est effectu l aide de transformations du code source (insertion $ dans le
nom des classes internes, insertion d attributs et paramtres cachs...).
public class LinkedList {









}

class LinkedListIterator
{
}

LinkedList.java
javac
LinkedList.class
LinkedList$LinkedListIterator.class
66
Classes internes
classes locales
Classes locales : dfinies l intrieur dun bloc de code
class X {
void work() {
class Local extends Superclass {}
}
}
Une classe locale est une classe interne, elle partage bien des caractristiques
des classes membres.
Une classe locale est aux classes membre ce quest une variable locale est aux
variables d instance
uniquement visible et utilisable dans le bloc de code o elle est dfinie
elle peut utiliser nimporte quelle variable locale (ou paramtre de mthode)
visible l endroit o elle est dfinie condition quelle (ou quil) soit dclar
final
exemple : (toujours d aprs Java In a Nutshell, 2nd Edition, D. Flanagan, O Reilly)
67
public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}
public Iterator iterator() {






















}

class LinkedListIerator implements Iterator {
private Linkable current;

public LinkedListEnumerator() {
current = head;
}
public boolean hasMoreElements() {
return current != null;
}
public Object nextElement() {
if(current == null)
throw NoSuchElementException(LinkedList);
Object value = current;
current = current.getNext();
return value
}
}
Classe locale
Classes internes
classes locales
public class LinkedList {
private Linkable head;
...
public void insert(Linkable node) {
...
}
public void remove(Linkable node) {
...
}
public Iterator iterator() {
return new LinkedListIterator();
}



















}

La dfinition de la classe est encore
rapproche de l endroit o elle est
utilise -> augmente clart du code (?)
private class LinkedListIterator implements Iterator
{
private Linkable current;

public Enumerator() {
current = head;
}
public boolean hasNext() {
return current != null;
}
public Object next () {
if(current == null)
throw NoSuchElementException(LinkedList);
Object value = current;
current = current.getNext();
return value
}
}
Classe membre
return new LinkedListIterator();

}
68
Classes internes
classes locales
Ce qui diffrencie une classe locale d une classe membre est qu elle a en plus
accs aux variables locales (et paramtres) visibles dans son bloc de dfinition.
Mais condition que ces variables et paramtres soient dclars final
Comment et pourquoi ?
public class A {
private int a;
...
public void methodeX(int param1, final int param2){
int local1;
final double local2;
local2 = ... ;












...
new B()
...

} // fin methode x
...
}
class B {
private int b;



public B() {
...
}
...
}
private int attributCach1;
private double attributCach2;
1
Une classe locale peut accder aux
variables locales car le compilateur
ajoute automatiquement :
des attributs privs pour stocker
une copie des variables locales
1
des paramtres cachs aux
constructeurs de la classe membre
pour initialiser ces attributs privs
crs automatiquement. 2
(private int pCach1, double pCach2) {
B(param2,local2)
2
Le seul moyen de maintenir ces
copies en accord avec les variables
locales est de dfinir ces dernires
comme finales
69
Classes internes
classes locales
Restrictions sur les classes locales
comme les classes membres elles ne peuvent contenir de
champs (attributs ou mthodes) static
comme les classes membres elles ne peuvent avoir le
mme nom que l une des classes englobantes
elles ne peuvent tre dclares public, protected, private
ou static (de la mme manire que ces modifieurs ne sont
pas autoriss pour des variables locales)
70
Classes internes
classes locales
Une utilisation trs courante des classes locales est pour la ralisation
d adaptateurs dvnements
reprenons la gestion des boutons de la barre d outils de l diteur graphique
type d vnement ActionEvent
source les JButton
interface d coute ActionListener
Annule le dernier trac
Efface toute la zone de dessin
rcepteur : utilisation d une classe locale dans le constructeur de la Barre d Outils
71
Des adaptateurs
aux classes internes
import java.awt.event.*;
import java.awt.*;

public class BarreOutils extends JPanel {

public BarreOutils( ZoneDessin zd) {
...
JButton bDefaire = new JButton("Dfaire");
this.add(bDefaire);
JButton bEffacer = new JButton("Tout effacer");
this.add(bEffacer);
...












...

}
Dans le code de BarreOutils
class BOActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bDefaire)
zd.defaire();
else if (e.getSource() == bEffacer)
zd.efface();
}
}
Classe interne
adaptateur
d vnements
Variables
dclares
finales pour
les rendre
accessibles
dans le code
de la classe
interne
final
final
final
BOActionListener boAL = new BOActionListener();
bDefaire.addActionListener(boAL);
bEffacer.addActionListener(boAL);
Cration d une
instance de
la classe interne
qui est lcoute
des boutons
72
public class A {
void methodA() {




}

void methodB() {





}
}

A.java
Classes internes
classes locales
Compilation de classes locales
class B
{
}
javac
A.class
class B extends C
{
}
A$1$B.class
A$2$B.class
73
Classes internes
classes anonymes
Classes locales : dfinies l intrieur dun bloc de code
une classe anonyme est une classe locale sans nom
permet de regrouper dfinition et instanciation dune classe locale
trs couramment utilises en tant quadaptateurs d vnements
class X {
void work() {
obj = new Superclass() {}
}
}
class Anonymous extends/implements Superclass
74
import java.awt.event.*;
import java.awt.*;

public class BarreOutils extends JPanel {

public BarreOutils(final ZoneDessin zd) {
...
JButton bDefaire = new JButton("Dfaire");
this.add(bDefaire);
JButton bEffacer = new JButton("Tout effacer");
this.add(bEffacer);
...
bDefaire.addActionListener(







);
bEffacer.addActionListener(







);
...

}
Avec des classes anonymes
Classes internes
classes anonymes
import java.awt.event.*;
import java.awt.*;

public class BarreOutils extends JPanel {

public BarreOutils(final ZoneDessin zd) {
...
final JButton bDefaire = new JButton("Dfaire");
this.add(bDefaire);
final JButton bEffacer = new JButton("Tout effacer");
this.add(bEffacer);
...









BOActionListener boAL = new BOActionListener();
bDefaire.addActionListener(boAL);
bEffacer.addActionListener(boAL);
...

}
class BOActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getSource() == bDefaire)
zd.defaire();
else if (e.getSource() == bEffacer)
zd.efface();
}
}
new ActionListener() {
public void actionPerformed(ActionEvent e)
{
zd.efface();
}
}
Avec une classe locale
Classe anonyme adaptateur
dvnements pour le JButton
new ActionListener() {
public void actionPerformed(ActionEvent e)
{
zd.defaire();
}
}
75
Classes internes
classes anonymes
new NomDeClasse([liste d arguments]) {
corps de la classe
}

new NomDinterface() {
corps de la classe
}

classe anonyme sous-classe de la
classe NomDeClasse
classe anonyme implmente l interface
NomDinterface
dans ce cas la classe anonyme est sous-
classe de Object
Une classe anonyme n ayant pas de nom il n est pas possible de dfinir de constructeur dans son
corps
Les arguments ventuellement spcifis aprs
NomDeClasse sont implicitement passs en
paramtre du constructeur de cette super-
classe
Jamais d arguments aprs NomDinterface
puisque le constructeur de la super-classe
(Object) n a pas d arguments
76
Classes internes
classes anonymes
public class EditeurGraphique
implements WindowListener {

public EditeurGraphique() {
...
this.addWindowListener(new ClosingAdapter());
this.show();
}

public static void main(String[] args)
{ new EditeurGraphique();
}
}
public class ClosingAdapter extends
WindowAdapter {

public void windowClosing(WindowEvent e)
{
System.exit(0);
}

}
public class EditeurGraphique
extends JFrame implements WindowListener {

public EditeurGraphique() {
...
this.addWindowListener(







);
this.show();
}

public static void main(String[] args)
{ new EditeurGraphique();
}
}
new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
sans classe interne avec classe interne anonyme
77
Classes internes
classes anonymes
comment choisir entre crire une classe locale ou crire une classe anonyme
choisir ce qui rend le code plus clair

classe anonyme
la classe doit avoir un corps petit
seule une instance de la classe est ncessaire
la classe est utilise juste aprs quelle soit dfinie
le nom ventuel de la classe ne rend pas le code plus facile comprendre

classe locale
la classe doit avoir plusieurs instances
la classe ncessite un constructeur
78
public class A {












}

A.java
Classes internes
classes anonymes
Compilation de classes anonymes
new B()
{
}
javac
A.class
new C()
{
}
A$1.class
A$2.class

Vous aimerez peut-être aussi