Vous êtes sur la page 1sur 73

Programmation Java : Patterns et bibliothques NFA035

Les Flux dentres/sorties


La Gnricit
Les Collections
Programmation vnementielle (GUI)

Abdallah EL Asmar

Programmation Java : Patterns et bibliothques NFA035

Les flux dentres/sorties


1. Package java.io
Ce package regroupe les classes et les interfaces concernant les entres et les sorties.
Quelques interfaces de java.io
DataInput

L'interface DataInput prvoit la lecture des octets d'un flux doctets et la


reconstitution partir de ces octets des donnes dans tous les types primitifs de Java.

DataOutput

L'interface DataOutput prvoit la conversion des donnes de tous les types primitifs
de Java en une srie d'octets et lcriture de ces octets dans un flux doctets.

ObjectInput

ObjectInput tend l'interface DataInput pour inclure la lecture d'objets.

ObjectOutput ObjectOutput tend l'interface DataOutput pour inclure l'criture d'objets.


Serializable

La srialisation d'une classe est active par limplmentation de linterface


java.io.Serializable.

Quelques Classes de java.io


File (implmente java.lang.Comparable, java.io.Serializable)
FileInputStream
InputStream
FilterInputStream
BufferedInputStream
DataInputStream (implmente java.io.DataInput)
ObjectInputStream (implmente java.io.ObjectInput)
OutputStream FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream (implmente java.io.DataOutput)
PrintStream
ObjectOutputStream (implmente java.io.ObjectOutput)
BufferedReader
Reader
InputStreamReder
FileReader
BufferedWriter
Writer
OutputStreamWriter
FileWriter
PrintWriter
RandomAccessFile (implmente java.io.DataInput, java.io.DataOutput)
IOException
EOFException
FileNotFoundException
InterruptedIOException
ObjectStreamException
En gnral, passer un argument null un constructeur ou une mthode dans n'importe quelle classe ou
interface dans ce package provoquera quune NullPointerException est leve.

Abdallah EL ASMAR

Page 2

Programmation Java : Patterns et bibliothques NFA035


2. Flux d'entre-sortie
Un flux est une squence ordonne d'octets. Dans un programme, nous traitons un flux soit comme un flux
d'entre, dont on lit les donnes, ou comme un flux de sortie, dont on crit des donnes. Le package java.io
fournit plusieurs classes qui nous permettent de dfinir des flux ayant des caractristiques particulires.
En plus de classifier les classes du package java.io en flux d'entre et de sortie, elles peuvent tre subdiviss
en deux autres manires primaires. Tout d'abord, nous pouvons diviser les classes suivant les types de
donnes sur lesquels ils oprent ; il existe essentiellement deux catgories de classes cet gard : ceux qui
oprent sur les donnes de type caractre et ceux qui oprent sur les octets.
Nous pouvons galement diviser les classes suivant le rle qu'ils jouent. Encore une fois, nous avons deux
catgories : celles qui reprsentent un type particulier de source ou de destination de donnes, telle qu'une
connexion de rseau ou un fichier et celles qui fournissent les moyens de modifier ou de grer les donnes
de base dans le flux.

Les flux dE/S de Java repose sur quatre classes abstraites :InputStream, OutputStream, Reader, Writer.
InputStream et OutputStream sont conues pour les flux d'octets. Reader/Writer sont conues pour les flux
de caractres.
Entres/Sorties standard
Trois flux sont souvent appels les flux I/O standard. La classe System contient trois variables de rfrence
d'objet (in, out et err) qui reprsentent les trois flux de I/O standard. Ces rfrences sont dclares comme
public et static, qui leur permet d'tre accessible directement via la classe System.
Le flux de I/O standard, par dfaut, reprsente notamment les priphriques d'I/O :
System.in reprsente gnralement les entres partir du clavier,
System.out et System.err reprsentent gnralement une fentre particulire sur l'cran.
3. La classe File
File est la classe centrale pour travailler avec les fichiers et les rpertoires. Fichiers et rpertoires sont
reprsents par des objets de File. La classe File dcrit les proprits d'un fichier ; elle est utilise pour
obtenir ou manipuler les informations associes un fichier sur disque, comme les autorisations, la date, le
temps et le chemin.
Constructeurs de File
File (String dirpath): crer un objet de File pour le rpertoire par dfaut (habituellement o se
trouve le programme).
File (String dirpath, String fname): crer un objet de File pour le chemin spcifi.
File (File dir, String fname): crer un objet de File pour le rpertoire spcifi par un objet de File.
Lorsqu'un objet de File est cr, le systme ne vrifie pas si le fichier/rpertoire correspondant est
rellement existe.
Abdallah EL ASMAR

Page 3

Programmation Java : Patterns et bibliothques NFA035


Mthodes de File
boolean exists(): retourne true si le fichier existe
boolean isFile(): retourne true s'il s'agit d'un fichier normal.
boolean isDirectory (): retourne true s'il s'agit d'un rpertoire.
boolean canRead(): retourne true si on peut lire le fichier.
boolean canWrite(): retourne true si on peut crire dans le fichier.
boolean isHidden(): retourne true si le fichier est masqu.
String getName(): renvoie le nom du fichier ou du rpertoire.
long length(): retourne le nombre d'octets du fichier.
String [] list(): retourne la liste des fichiers et rpertoires l'intrieur d'un rpertoire spcifique.
File []ListFiles(): retourne la liste des fichiers sous forme de tableau d'objets de File.
String getPath (): retourne le chemin d'accs ou le nom du fichier si le chemin n'est pas spcifi.
boolean renameTo(File nouveau_nom): renomme un fichier et renvoie un boolean indiquant si cette
mthode a t bien droule.
boolean delete(): supprime un fichier ou un rpertoire vide. Retourne false si le fichier ne peut pas
tre supprim.
void deleteOnExit (): supprime un fichier juste avant quitter Java.
boolean mkdir(): cre un rpertoire et retourne une valeur boolenne indiquant le succs de la
cration.
4. Les flux d'octets
4.1. InputStream
InputStream est une classe abstraite, elle est la superclasse de toutes les classes qui reprsentent un flux
d'octets en entre.
Toutes les mthodes de cette classe lvent une exception IOException dans le cas d'erreur.
Mthodes
int read( ): renvoie une reprsentation entire du prochain octet disponible de lentre. Elle retourne
(-1) si la fin du flux est atteinte.
int read (byte b [] ): lecture jusqu' b.length octets partir du flux d'entre et les mettre dans un
tableau d'octets. Retourne le nombre total d'octets (b.length) lu dans la mmoire tampon, ou -1 si la
fin du flux est atteinte.
int read ( byte b [], int start, int num ): lectures jusqu' num octets de donnes depuis le dmarrage
du flux d'entre dans un tableau d'octets.
long skip(long n): permet de sauter plus de n octets de donnes du flux d'entre. Retourne le nombre
d'octets effectivement ignors.
int available( ): renvoie le nombre d'octets qui peut tre lu.
void close( ): ferme le flux d'entre.
void mark(int numBytes ): met une marque la position actuelle du flux d'entre, cette marque reste
valide jusqu la lecture de numBytes.
void reset (): repositionne le flux la position qui correspond la dernire fois o la mthode mark a
t appele sur ce flux d'entre.

Abdallah EL ASMAR

Page 4

Programmation Java : Patterns et bibliothques NFA035

4.2. OutputStream
Cette classe est une classe abstraite qui est la superclasse de toutes les classes qui reprsentent des flux
d'octets en sortie.
Toutes les mthodes de cette classe ont le type de retour void et elles lvent une exception IOException dans
le cas d'erreur.
Mthodes
void close( ): ferme le flux de sortie.
void flush( ): vider le flux de sortie et oblige lcriture de tous les octets de la mmoire tampon.
void write(int b): crit un seul octet dans un flux de sortie.
void write(byte b[]): crit un tableau complet d'octets dans un flux de sortie.
void write(byte b[], int start, int numBytes): crit dans le flux de sortie une partie du tableau b
constitu de numBytes octets, commenant b[start].
4.3. FileInputStream
Cette classe est une sous-classe de InputStream ; elle cre un flux de donnes permettant la lecture des octets
d'un fichier.
FileInputStream redfinit six des mthodes de la classe abstraite InputStream. Les mthodes mark() et
reset() ne sont pas supportes.
Elle possde deux constructeurs :
FileInputStream (String filepath): filepath est le nom de chemin d'accs complet d'un fichier
FileInputStream (File fileObj): fileObj est un objet de fichier qui dcrit un fichier.
Chacun deux peut lever une exception FileNotFoundException.
4.4. FileOutputStream
Cette classe est une sous-classe de OutputStream ; elle cre un flux de donnes permettant lcriture des
octets dans un fichier.
Elle possde trois constructeurs :
- FileOutputStream (String filepath): filepath est le nom de chemin d'accs complet d'un fichier.
- FileOutputStream (File fileObj): fileObj est un objet de File qui dcrit un fichier.
Chacun de ces constructeurs cre un fichier avant de l'ouvrir pour la sortie.
- FileOutputStream (String filepath, boolean append): si append a la valeur true, le fichier est ouvert
dans le mode Ajouter.
Chacun deux peut lever une exception FileNotFoundException.
4.5. Les flux buffer
Un flux en mmoire tampon (buffer) attache une mmoire tampon au flux dI /O. Ce tampon permet au Java
de faire des oprations d'I/O sur plus d'un octet la fois, ce qui permet d'augmenter les performances. Les
flux d'octets de tampon sont BufferedInputStream et BufferedOutputStream.
a) BufferedInputStream :
Constructeur : BufferedInputStream (InputStream)
En plus des mthodes skip() et read() implments par toute classe drive de InputStream,
BufferedInputStream prend galement en charge les mthodes mark() et reset().

Abdallah EL ASMAR

Page 5

Programmation Java : Patterns et bibliothques NFA035


b) BufferedOutputStream :
Constructeur : BufferedOutputStream (OutputStream)
Un BufferedOutputStream est semblable n'importe quel OutputStream l'exception d'un ajout de
la mthode flush() qui sert s'assurer que les tampons de donnes sont crits physiquement au
priphrique de sortie.
4.6. DataInputStream
Cette classe contient des mthodes permettant la lecture des donnes de types primitifs de Java.
Constructeur : DataInputStream (InputStream)
Mthodes:
boolean readBoolean ()
byte readByte ()
short readShort ()
char readChar ()
int readInt()

long readLong ()
float readFloat ()
double readDouble ()
String readUTF()

4.7. DataOutputStream
Cette classe contient des mthodes permettant lcriture des donnes de types primitifs de Java.
Constructeur : DataOutputStream (OutputStream)
Mthodes :
void writeBoolean (boolean v)
void writeByte (int v)
void writeShort (int v)
void writeChar (int v)
void writeInt (int v)
void writeLong (long v)
void writeFloat (float v)
void writeDouble (double v)
void writeUTF (String s)

Abdallah EL ASMAR

Page 6

Programmation Java : Patterns et bibliothques NFA035

5. Les flux de caractres


5.1. La classe Reader
Classe abstraite pour la lecture de flux de caractre. Les seules mthodes qu'une sous-classe doit
implmenter sont read (char [], int, int) et close(). La plupart des sous-classes, cependant, remplacera
certaines des mthodes dfinies ici afin de fournir une plus grande efficacit, une fonctionnalit
supplmentaire ou les deux.
Mthodes
int read(): lire un caractre unique. Elle retourne le caractre lu, sous forme d'entier dans la plage
0 65535, ou -1 si la fin du flux a t atteinte.
int read(char [] c) : lire des caractres et les sauvegarde dans un tableau de caractres. Cette
mthode retourne le nombre de caractres lus, ou -1 si la fin du flux a t atteinte.
int read ( char [] c, int start, int num ): lire jusqu' num caractres et les sauvegarde
dans dmarrage du flux d'entre dans un tableau de caractres.
long skip (long n) : sauter n caractres. Retourne le nombre de caractres effectivement ignors.
boolean ready() : vrifie si ce flux est prt tre lu.
void mark ( int numChars ) : , marquer la position actuelle dans le flux ; cette marque reste valide
jusqu' que numChars caractres sont lus. Lappel suivant reset() va repositionner le flux cette
position marque. Pas tous les flux d'entre de caractres prend en charge la mthode mark().
void reset(): si le flux a t marqu, repositionne ce flux la position marque.
void close(): fermer le flux. (Fermer un flux prcdemment ferm n'a aucun effet).
5.2. La classe Writer
Classe abstraite pour l'criture dans le flux de caractres. Les seules mthodes qu'une sous-classe doit
implmenter sont write (char [], int, int), flush() et close(). La plupart des sous-classes, cependant,
remplacera certaines des mthodes dfinies ici afin de fournir une plus grande efficacit, une
fonctionnalit supplmentaire ou les deux.
Mthodes
void close( ): ferme le flux de sortie.
void flush( ): vide le flux de sortie et oblige lcriture de tous les caractres de la mmoire
tampon.
void write(int c): crit un caractre unique dans un flux de sortie.
void write(char c[]): crit un ensemble de caractres dans un flux de sortie.
void write(char c[], int start, int numChars): crit dans un flux de sortie numChars caractres du
tableau c partir de c[start].
void write(String s): crit une chane dans un flux de sortie.
5.3. La classe FileReader
FileReader est conue pour lire des caractres partir dun fichier. FileReader redfinit toutes les
mthodes de la superclasse directe InputStreamReader et de la classe abstraite Reader.

Abdallah EL ASMAR

Page 7

Programmation Java : Patterns et bibliothques NFA035


Elle possde deux constructeurs :
FileReader (String filepath): filepath est le nom de chemin d'accs complet d'un fichier.
FileReader (File fileObj): fileObj est un objet de File qui dcrit un fichier.
Chacun deux peut lever une exception FileNotFoundException.
5.4. La classe FileWriter
FileWriter est destine l'criture de caractres dans des fichiers. FileWriter redfinit toutes les mthodes
de sa super classe directe OutputStreamWriter et de la classe abstraite Writer.
Elle a trois constructeurs :
- FileWriter (String filepath): filepath est le nom du chemin d'accs complet d'un fichier.
- FileWriter (fichier fileObj): construit un objet FileWriter partir dun objet File qui dcrit un
fichier.
- FileWriter (String filepath, boolean append): construit un objet FileWriter qui permet douvrir le
fichier spcifi en mode Append.
Chacun deux peut lever une exception IOException si quelque erreur d'E/S se produit.
5.5. La classe BufferedReader
Cette classe utilise une mmoire tampon de caractres afin d'assurer une lecture efficace des caractres,
des tableaux et des lignes.
La taille du tampon peut tre spcifie, ou la taille par dfaut peut tre utilise. La valeur par dfaut est
assez grande pour la plupart des cas.

BufferedReader (Reader in) : crer un flux tamponn de caractres en entre qui utilise une
taille de mmoire tampon par dfaut.
BufferedReader (Reader in, int sz) : crer un flux tamponn de caractres en entre qui utilise
une mmoire tampon de la taille spcifie.

BufferedReader implmente et redfinit toutes les mthodes de sa classe super Reader. En plus, il dispose
de la mthode : String readLine () : permettant de lire une ligne de texte.
5.6. La classe BufferedWriter
Cette classe utilise une mmoire tampon de caractres afin d'assurer une lecture efficace des caractres,
des tableaux et des lignes.
La taille du tampon peut tre spcifie, ou la taille par dfaut peut tre utilise. La valeur par dfaut est
assez grande pour la plupart des cas.
BufferedWriter (Writer out) : crer un flux tamponn de caractres en sortie qui utilise une
mmoire tampon avec la taille par dfaut.
BufferedWriter (Writer out, int sz) : crer un flux tamponn de caractres en sortie qui utilise une
mmoire tampon avec la taille spcifie.
BufferedWriter implmente et redfinit toutes les mthodes de sa superclasse Writer. En outre, elle
dispose de la mthode : void newLine(): crire une ligne sparateur.

Abdallah EL ASMAR

Page 8

Programmation Java : Patterns et bibliothques NFA035


5.7. La classe PrintWriter
Imprimer des reprsentations formates d'objets dans un flux de texte-sortie. Cette classe est une
sousclasse de la classe Writer.
Constructeurs :

PrintWriter(OutputStream out): crer un nouveau PrintWriter partir dun OutputStream existant

PrintWriter (OutputStream out, boolean autoFlush): crer un nouveau PrintWriter partir dun
OutputStream existant. autoFlush : boolean ; Si true, les mthodes println() vont vider le tampon
de sortie

PrintWriter (Writer out): crer un nouveau PrintWriter partir dun Writer existant.

PrintWriter (Writer out, boolean autoFlush): crer un nouveau PrintWriter partir dun Writer
existant avec vidage automatique.

Mthodes :
void close( ) : fermer le flux.
void flush ( ) : Vide la mmoire tampon.
void print ( X ) : imprimer la valeur de X. X peut tre : boolean, char, char [], double, float, int,
long, String ou Object.
void println ( ) : imprimer une ligne sparateur.
void println ( X ): imprimer la valeur de X et puis mettre fin la ligne. X peut tre : boolean,
char, char [], double, float, int, long, String ou Object.
void write (char[] buf ) : crire un tableau de caractres.
void write (char[] buf, int off, int len ) : crire une partie d'un tableau de caractres.
void write (int c ) : crire un caractre unique.
void write (String s ) : crire une chane.
6. Les srialisations
Java contient un mcanisme appel la srialisation de l'objet permettant de crer des objets persistants. La
persistance est le concept qu'un objet peut exister sparment au programme qui la cre.
Lorsqu'un objet est srialis, il se transforme en une squence d'octets ; Cette squence est une
reprsentation binaire de l'objet. Plus tard, cette reprsentation peut tre restaure l'objet original. Une
fois srialis, l'objet peut tre stock dans un fichier pour une utilisation ultrieure.
Dans Java, la srialisation d'objets s'effectue avec l'aide de l'interface Serializable et les deux classes
ObjectOutputStream et ObjectInputStream.
Lobjet srialiser, doit implmenter l'interface Serializable. Cette interface ne contient aucune
mthode ; elle sert plutt comme un drapeau au compilateur que les objets de ce type peuvent
tre srialiss.

Abdallah EL ASMAR

Page 9

Programmation Java : Patterns et bibliothques NFA035

De nombreuses classes de la bibliothque standard de Java implmentent linterface Serializable


afin qu'ils puissent tre srialises selon les besoins ; par exemple, la classe String, la classe
Date, la classe ArrayList...
Pour srialiser un objet, on utilise la mthode writeObject d'un ObjectOutputStream.
Pour dsrialiser un objet, on utilise la mthode readObject d'un ObjectInputStream.
L'acte de srialisation prend automatiquement en compte tout objet rfrenc. C'est--dire il
poursuit automatiquement toutes les rfrences contenues dans l'objet en cours de srialisation et
les srialise.
Le mot rserv transient peut tre utilis pour modifier la dclaration d'une variable de sorte
qu'il n'est pas reprsent dans le cadre du flux lorsque l'objet le contenant est srialis.
Le flux ObjectOutputStream implmente l'interface DataOutput qui dfinit de nombreuses
mthodes pour crire des types de donnes primitifs, tels que writeInt, writeFloat ou writeUTF.
On peut utiliser ces mthodes pour crire des types de donnes primitifs dans un
ObjectOutputStream.
ObjectInputStream implmente l'interface DataInput qui dfinit les mthodes de lecture des
types de donnes primitifs, par exemple les mthodes readInt, readFloatet et readUTF. Ces
mthodes permettent de lire les types de donnes primitifs d'un ObjectInputStream.
La mthode writeObject lve une NotSerializableException si lobjet concern est non
srialisable.

Abdallah EL ASMAR

Page 10

Programmation Java : Patterns et bibliothques NFA035


Gnricit

Introduction
Dans tout projet informatique, les bugs sont tout simplement une ralit, quelques bugs, comme les
erreurs de compilation, sont trs faciles dtecter, d'autres, comme les erreurs de l'excution, peuvent
tre beaucoup plus problmatiques. La gnricit permet dajouter une stabilit lapplication en
rendant plus de ses bugs dtectables au moment de la compilation.
Considrons la classe non-gnrique Box qui opre sur des objets de n'importe quel type.
public class Box {
private Object ob;
public void add(Object ob) {
this.ob = ob;
}
public Object get() {
return ob; }
}

Puisque, ses mthodes acceptent ou retournent des instances de la classe Object, alors nous sommes
libres de passer ces mthodes ce que nous voulons. Toutefois, nous aurions besoin de restreindre le
contenu un type spcifique (comme Integer), notre seule option serait de spcifier les exigences en
documentation (ou dans ce cas, un commentaire).
public class BoxDemo {
public static void main(String[] args) {
// Placer seulement des objets Integer dans ce box!
Box integerBox = new Box();
integerBox.add(new Integer(10));
Integer someInteger = (Integer)integerBox.get();
System.out.println(someInteger);
}
}

Le compilateur fait confiance que nos interprtes sont correctes ; Il ne fera rien pour empcher un
programmeur de passer un objet de type incorrect, telle que une String.
// ...
// Imaginer que ceci est une partie d'une grande application
// modifie par un programmeur.
integerBox.add("10");
// ... et ceci est une autre partie, crite par un
// autre programmeur
Integer someInteger = (Integer)integerBox.get();
System.out.println(someInteger);

C'est clairement un bug, mais parce que le code se compile toujours, nous ne savons jamais que ceci
est faux jusqu'au moment de l'excution, lorsque l'application se bloque avec une
ClassCastException.
Une solution possible, mais non pratique, consiste dfinir plusieurs classes de Box, une pour les
entiers, l'autre pour les String,...

Abdallah EL ASMAR

Page 11

Programmation Java : Patterns et bibliothques NFA035


Au lieu de cela, nous pouvons dfinir une classe Box gnrique et crer des instances de Box de
n'importe quel objet, certains pour les entiers, d'autres pour les String, ...
Les types gnriques
Pour dfinir une classe gnrique de Box, nous allons tout d'abord crer une dclaration de type
gnrique en changeant le code public class Box public class Box<T> ; Cela
introduit une variable de type, nomm T, qui peut tre utilis n'importe o l'intrieur de la classe. T
est un genre spcial de variable, dont la valeur sera le type nous transmettez ; Cela peut tre
n'importe quel type de classe ou n'importe quel type d'interface. Dans ce contexte, nous disons aussi
que T est un paramtre formel de type de la classe Box.
/* Version gnrique de la classe Box */
public class Box <T> {
private T t;
public void add(T ob) {
t = ob;
}
public T get() {
return t;
}
}

Pour faire rfrence cette classe gnrique, nous devons effectuer un appel de type gnrique,
qui remplace T avec des valeurs concrtes.
Un appel d'un type gnrique est gnralement connu comme un type paramtr.
public class BoxDemo3 {
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.add(new Integer(10));
// Une fois integerBox est initialis,
// vous tes libre d'appeler sa mthode get sans fournir un cast.
Integer someInteger = integerBox.get();
System.out.println(someInteger);
// crer un box de strings
Box<String> stringBox = new Box<String>();
integerBox.add(A Box of Strings);
System.out.println(stringBox.get());
}
}

Un type gnrique peut avoir plusieurs paramtres de type, mais chaque paramtre doit tre unique
dans la classe ou linterface o il est dclar.
Un type gnrique ne pas tre appliqu des mthodes et des variables statiques.
Par convention, les noms de paramtres de type sont simples et en majuscule.

Abdallah EL ASMAR

Page 12

Programmation Java : Patterns et bibliothques NFA035


Mthodes et constructeurs gnriques
Les paramtres de type peuvent tre galement dclars dans les signatures de mthodes et de
constructeurs pour crer des mthodes et des constructeurs gnriques. Ceci est semblable la
dclaration d'un type gnrique, mais la porte du paramtre de type est limite la mthode ou le
constructeur dans lequel il est dclar.
public class Box<T> {
private T t;
public void add(T ob) { t = ob;
}
public T get() {
return t;
}
public <U> void inspect(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.add(new Integer(10));
integerBox.inspect("some text");
}
}

Paramtre de type born


Pour restreindre les genres des types qui sont permis passer un paramtre de type, on peut dclarer
un paramtre de type born. Par exemple, une mthode qui fonctionne sur les nombres peut seulement
accepter des instances de Number ou de ses sous-classes.
Pour dclarer un paramtre de type born, il faut indiquer le nom du paramtre de type, suivi de du
mot cl extends, suivi de sa limite suprieure, qui est , dans cet exemple, Number. Notez que, dans
ce contexte, extends est utilis dans un sens gnral pour signifier "extends" (comme dans les
classes) ou "implements" (comme dans les interfaces).
public class Box<T> {
private T t;
public void add(T ob) { t = ob;
public T get() { return t; }

public <U extends Number> void inspect(U u){


System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
integerBox.add(new Integer(10));
integerBox.inspect(new Double(10.5));
integerBox.inspect(new Integer(5));
// integerBox.inspect(some text); // error
}
}

Pour spcifier des interfaces supplmentaires qui doivent tre implments, utiliser le caractre &, de
la faon suivante:
<U extends Number & AutreInterface>
Abdallah EL ASMAR

Page 13

Programmation Java : Patterns et bibliothques NFA035


Sous typage
Considrons le code suivant:
Box<Number> numberBox = new Box<Number>();
numberBox.add(new Integer(10));

Ce code est valable ; Nous pouvons assigner un objet Integer un objet Number car Integer est une
sous-classe de Number.
Considrons maintenant l'instruction:
Box<Number> numberBox = new Box<Integer>();

Cette instruction provoque une erreur de compilation; Box<Integer> nest pas une sous-classe de
Box<Number>.
En gnral, si ClasseDeux est un sous-type (sous-classe ou sous-interface) de ClasseUne, et Test est
dclaration dun type gnrique, ce nest pas le cas que Test<ClasseDeux> est un sous-type de
Test<ClasseUne>.
Wildcards (Caractres gnriques)
Un wildcard dcrit une famille de types. Les wildcards sont utiliss pour dclarer des types gnriques
paramtrs, dont un wildcard est utilis comme argument pour les instanciations de types gnriques.
Les wildcards sont utiles dans des situations o aucune ou seulement une partielle connaissance au
sujet de type de l'argument d'un type paramtr est ncessaire
Dans tous les cas o, vous pouvez utiliser un paramtre de type dans un champ, une mthode ou une
dclaration de variable, vous pouvez utiliser sa place un wildcard ?, tant donn que vous n'en fait
rfrencez le paramtre de type nomm dans votre code.
Ainsi, par exemple, supposons que vous aviez la mthode suivante :
// Version 1.
public <T extends Animal> void printAnimals(Collection <T> animals) {
for (Animal nextAnimal: animals) {
System.out.println(nextAnimal);}

Le corps de la mthode ne rfrence pas du tout T--le paramtre de type est dclar mais pas utilis.
Dans ce cas, vous pouvez supprimer la dclaration de T et remplacer l'utilisation de T avec un
wildcard (qui est toujours reprsent par ?).
// Version 2, wildcarded.
public void printAnimals(Collection <? extends Animal> animals) {
for (Animal nextAnimal: animals) {
System.out.println(nextAnimal);}
}

Abdallah EL ASMAR

Page 14

Programmation Java : Patterns et bibliothques NFA035

Le wildcard ? est admis pour exprimer le fait qu'une grande varit de types correspond la
dclaration.
De mme, vous pouvez utiliser des caractres gnriques dans les dclarations de champ. Par
exemple, dans le code suivant, nous avons une collection prive dfinie en utilisant le paramtre de
type T.
public class Trainer<T extends Animal> {
private Collection<T> _myAnimals = new ArrayList<T>();

Si le fait que la collection contient des instances de T n'tait pas important, nous pouvons dclar la
collection comme suit :
private Collection<? extends Animal> _myAnimals = new ArrayList<T>();

Une autre extension est le mot cl "super". Tout comme vous pouvez dclarer ? extends Animal,
vous pouvez dclarer ? super Animal.
Il y a trois types de wildcards:
"? extends Type": Dsigne une famille de sous-types de type Type. C'est le wildcard le plus
utile
"? super Type": Dsigne une famille de super-types de type Type
"?": Dsigne lensemble de tous les types.
Le premier avantage de Wildcards: wildcards permet de rendre le code plus propre et plus facile lire:
public void printAnimals(Collection <? extends Animal> animals) { ..
public <T extends Animal> void printAnimals(Collection <T> animals) {..

Le second avantage de Wildcards: wildcards remplacent n'importe quel type sans aucune restriction:
public static <T> void copy( List<T> dest, List<T> src) {

//

restriction
// implmentation; ncessite que dest et src doivent tre des listes avec le mme type
exactement.
public static void copy( List<?> dest, List<?> src) {//
//dest et src peuvent tre des listes avec des types diffrents.

Abdallah EL ASMAR

Page 15

pas de restriction

Programmation Java : Patterns et bibliothques NFA035


Collections

Une collection est un conteneur qui permet de grouper plusieurs lments en une seule unit. Les
collections aident stocker, extraire et manipuler des donnes. En Java, le Framework Collections
fournit un ensemble d'interfaces et de classes pour stocker et manipuler des groupes d'objets selon une
mthode standardise.

Le Framework Collections a t labor avec les objectifs suivants:


Haute performance.
Les diffrents types de collections devraient fonctionner dune manire semblable les uns aux
autres et devraient avoir l'interoprabilit.
Il devrait tre facile d'tendre une collection.
Le Framework Collections appartient au package java.util.
Linterface Collection
L'interface Collection est la racine de lhirarchie de collection que toutes les collections
limplmentent. Collection est utilise pour gnraliser la manipulation des collections. Certains
types de collections acceptent des lments en double, et d'autres pas. Certains types sont ordonns et
d'autres ne sont pas ordonns. La plate-forme Java ne fournit pas des implmentations directes de
cette interface.
Sous-interfaces: List, Set, Queue
Quelques classes qui implmentent ces sous-interfaces : ArrayList, HashSet, LinkedHashSet,
LinkedList, TreeSet, Vector
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
// optional
boolean remove(Object element);
// optional

Abdallah EL ASMAR

Page 16

Programmation Java : Patterns et bibliothques NFA035


Iterator<E> iterator();
//
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c);
//optional
boolean retainAll(Collection<?> c);
//optional
void clear(); // To empty a collection
//optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}

<E> est un paramtre de type permettant dindiquer quel type d'objets doit tre stocke dans cette
collection.
Un Iterator (itrateur) est un objet qui vous permet de parcourir une collection avec la possibilit de
supprimer des lments de cette collection. Vous obtenez un itrateur pour une collection en appelant
sa mthode iterator().
Le code de linterface Iterator :
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); //optional
}

Linterface Set
Set est une collection non ordonne qui ne contient pas d'lments dupliqus et au plus elle contient un
lment null. Comme impliqu par son nom, cette interface modlise l'abstraction mathmatique de
lensemble.
public interface Set<E> extends Collection<E> {
boolean containsAll(Collection<?> c); // subset
void addAll(Collection<? extends<E>> c); // union
void retainAll(Collection<?> c); // intersection
void removeAll(Collection<?> c); // difference
// Plus methods inherited from class Collection
}

Ces mthodes supplmentaires correspondent aux oprations de la thorie des ensemble :


Supposons que S et T sont des variables de type Set. Alors:
S.contains(x) est quivalent x S.
S.containsAll(T) est quivalent T S.
S.addAll(T) est quivalent S = S T.
S.retainAll(T) est quivalent S = S T.
S.removeAll(T) est quivalent S = S T.

Abdallah EL ASMAR

Page 17

Programmation Java : Patterns et bibliothques NFA035


La classe HashSet
HashSet implmente linterface Set.
Elle cre une collection qui permet dutiliser une table de hachage pour le stockage.
Une table de hachage est une structure de donnes qui stocke des informations par lassociation de la
cl de chaque lment de donnes une position ou indice dun tableau, appel code de hachage. La
mthode int hashCode() de la classe Object renvoie le code de hachage associ l'objet
appelant.
Constructeurs:
HashSet ( ): Construit un nouveau Set vide;
HashSet (Collection<? extends E> ): Construit un nouveau Set contenant les lments
de la collection spcifie.
Exemple:
import java.util.*;
public class HashSetEx<T>{
private Set<T> S1 = new HashSet<T>();
private Set<T> S2 = new HashSet<T>();
public HashSetEx(T [] data){
for (T ob: data) S1.add(ob); }
public void display(){
System.out.println("Size of the set : " + S1.size());
System.out.println("Contents of the set :" + S1); }
public void test(Set<T> X){
T ob;
Iterator<T> iter = X.iterator();
while (iter.hasNext()) { ob = iter.next();
if (S1.contains(ob)) S2.add(ob);
else S1.add(ob);}
}
public static void main(String[] args) {
String [] SA = {"Sam","Daniel", "Sam", "Claire"};
HashSetEx<String> H = new HashSetEx<String>(SA);
H.display();
Set<String> SS = new HashSet<String>();
SS.add("Daniel");SS.add("Sam");SS.add("Tom");
H.test(SS);
H.display();
} }

La classe TreeSet
La classe TreeSet implmente galement linterface Set et utilise une arborescence pour stocker les
donnes. Les objets sont stocks en ordre croissant et par consquent laccs et la rcupration d'un
objet est beaucoup plus rapide.
Si vous devez utiliser les oprations dans l'interface de SortedSet, ou si l'itration valeur ordonne est
requise, utilisez TreeSet ; dans le cas contraire, utiliser HashSet.

Abdallah EL ASMAR

Page 18

Programmation Java : Patterns et bibliothques NFA035


Constructeurs:
TreeSet ( ): Construit un nouvel TreeSet vide, tri selon l'ordre naturel de ses lments..
TreeSet (Collection<? extends E> ): Construit un nouvel TreeSet qui contient les
lments de la collection spcifie, tri selon l'ordre naturel de ses lments.
Linterface List
List est une collection ordonne qui peut contenir des lments dupliqus. Il fournit des mthodes
supplmentaires pour crer et grer des collections ordonnes. ArrayList et LinkedList sont
des implmentations de List.
public interface List<E> extends Collection<E> {
// Positional access
E get(int index);
E set(int index, E element);
// optional
boolean add(E element);
// optional
void add(int index, E element);
// optional
E remove(int index);
// optional
boolean addAll(int index, Collection<? extends E> c); // optional
// Search
int indexOf(Object o);
int lastIndexOf(Object o);
// Iteration
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index);
// Range-view
List<E> subList(int from, int to);
}
List<E> subList(int fromIndex, int toIndex): Retourne une vue de la portion de la

liste entre fromIndex, inclut, et toIndex, exclut.


Linterface ListIterator
ListIterator, extends Iterator, elle permet une traverse bidirectionnelle d'une liste et la modification des
lments.
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
// optional
void set(E e);
// optional
void add(E e);
// optional
}

La mthode nextIndex( ) retourne l'index de l'lment suivant. S'il n'y a pas un lment suivant, elle
retourne la taille de la liste.

Abdallah EL ASMAR

Page 19

Programmation Java : Patterns et bibliothques NFA035


La mthode previousIndex( ) retourne l'index de l'lment prcdent. S'il n'y a pas un lment
prcdent, elle retourne 1.
La mthode set( ) remplace llment courant par llment spcifi.
La mthode add( ) insre un nouvel lment dans la liste immdiatement avant la position actuelle du
curseur.
La classe ArrayList
Cest une implmentation Tableau-redimensionnable de l'interface List. Met en uvre toutes les
oprations facultatives de List et autorise tous les lments, y compris null.
Constructeurs
ArrayList( ): Construit une liste vide d'une capacit initiale de dix.
ArrayList(int initialCapacity ): Construit une liste vide avec la capacit initiale spcifie.
ArrayList(Collection<? extends E> ): Construit une liste contenant les lments de la
collection spcifie, dans l'ordre qu'elles sont retournes par l'itrateur de la collection.
Exemple
/* La classe gnrique ListsOP a deux ArrayLists s1, s2, qui reprsentent deux groupes d'objet et trois
mthodes qui retournent une ArrayList s3 qui reprsente le rsultat de l'union, de lintersection ou de la
diffrence de ces deux groupes. */
import java.util.*;
class ListsOP<T>{
private ArrayList<T> s1 = new ArrayList<T>();
private ArrayList<T> s2 = new ArrayList<T>();
private ArrayList<T> s3 = new ArrayList<T>();
ListsOP (T[] a, T[] b){
for (T ob: a) s1.add(ob);
for (T ob: b) s2.add(ob);
}
ListsOP (T ... a){
for (int i = 0; i<a.length; i++)
if(i <a.length/2) s1.add(a[i]);
else s2.add(a[i]);
}
ArrayList<T> getS1(){
return s1; }
ArrayList<T> getS2(){
return s2; }
ArrayList<T> union (){
s3.clear();
//for (T ob: s1) s3.add(ob);
T ob1;
for (int i = 0; i < s1.size(); i++){
ob1 = s1.get(i); s3.add(ob1);
}
for (T ob: s2) if (! s3.contains(ob))s3.add(ob);
return s3;
}
ArrayList<T> intersection(){
s3.clear();
//for (T ob: s1) if (s2.contains(ob)) s3.add(ob);
T ob;
Iterator<T> iter = s1.iterator();
while (iter.hasNext()) { ob = iter.next();

Abdallah EL ASMAR

Page 20

Programmation Java : Patterns et bibliothques NFA035


if (s2.contains(ob)) s3.add(ob);
return s3;

}
ArrayList<T> minus(){
s3.clear();
for (T ob: s1) if (!s2.contains(ob)) s3.add(ob);
return s3;
}
}
class TestLists {
public static void main (String arg[]){
String [] sa1 = {"abc", "cde", "nmv", "der"};
String [] sa2 = {"abx", "cde", "nmv", "pot"};
ListsOP<String> A = new ListsOP<String>(sa1, sa2);
display(A);
//Integer [] ia1 = {4, 6, 8, 9, 10};
//Integer [] ia2 = {9, 7, 14, 8, 13, 20};
//ListsOP<Integer> B = new ListsOP<Integer>(ia1, ia2);
ListsOP<Integer> B = new ListsOP<Integer>(4, 6, 8, 9, 10,9, 7, 14, 8);
display(B);
}
//static <S> void display(ListsOP<S> ss){
static void display(ListsOP<?> ss){
System.out.println("First set: " + ss.getS1() );
System.out.println("Second set: " + ss.getS2() );
System.out.println("\t\t Union Result : " + ss.union() );
System.out.println("\t\t Intersection Result : " + ss.intersection() );
System.out.println("\t\t Minus Result : " + ss.minus() );
}
}

La classe LinkedList
LinkedList implmente linterface List, Il met en uvre toutes les oprations facultatives de List.
LinkedList est une liste avec un lien de chaque lment llment suivant.
Les listes lies peuvent tre utilis comme une pile, une file d'attente.
Constructeurs
LinkedList( ): Construit une liste vide.
LinkedList(Collection<? extends E> ): Construit une liste contenant les lments de la
collection spcifie, dans l'ordre qu'elles sont retournes par l'itrateur de la collection.
Mthodes
void addFirst(E o) : Insre l'lment spcifi au dbut de la liste.
void addLast(E o) : Ajouter l'lment spcifi la fin de la liste.
E removeLast(): Supprime et retourne le dernier lment de la liste.
E removeFirst():Supprime et retourne le premier lment de la liste.
E getLast() :Retourne le dernier lment de la liste.
E getFirst(): Retourne le premier lment de la liste.

Abdallah EL ASMAR

Page 21

Programmation Java : Patterns et bibliothques NFA035

Linterface Map et ses implmentations


Map est un objet qui stocke les donnes sous forme de relations entre cls et valeurs. Un Map ne peut
pas contenir des cls dupliques ; chaque cl peut associer au plus une valeur. Si les informations de
cl sont connues, sa valeur peut tre extraite de l'objet Map.
Voici les classes qui implmentent l'interface Map :
HashMap: utilis pour crer des tables de hachage
TreeMap: utilis pour crer des arbres
public interface Map<K,V> {
int size();
boolean isEmpty();
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
public Set<K> keySet();
public Collection<V> values();
public void clear();
//
}

La classe HashMap
HashMap implemente linterface Map. Cette implmentation fournit toutes les oprations optionnelles
de Map et autorise les valeurs null et la cl null. Cette classe ne donne aucune garantie quant l'ordre
du Map ; en particulier, elle ne garantit pas que l'ordre demeurera constant au fil du temps.
Constructors
HashMap() Construit une HashMap vide avec la capacit initiale par dfaut (16)
HashMap(int initialCapacity) Construit une liste vide avec la capacit
spcifie.Constructs an empty HashMap with the specified initial capacity
Example
import java.util.*;
public class Test {
public static void main(String[] args)
{
//map to hold student grades
Map<String, Integer> theMap = new HashMap<String, Integer>();
theMap.put("Korth, Evan", 100);
theMap.put("Plant, Robert", 90);
theMap.put("Coyne, Wayne", 92);
theMap.put("Franti, Michael", 98);
theMap.put("Lennon, John", 88);
System.out.println(theMap);
System.out.println("--------------------------------------");
System.out.println(theMap.get("Korth, Evan"));
System.out.println(theMap.get("Franti, Michael"));
}
}

Abdallah EL ASMAR

Page 22

initiale

Programmation Java : Patterns et bibliothques NFA035


La classe TreeMap
La classe TreeMap implmente linterface SortedMap (et donc linterface Map aussi), mais stocke les
lments dans une structure arborescente. Le treeMap retourne les cls dans un ordre tri.
Constructeurs
TreeMap( ) Construit un Map vide, tri selon l'ordre naturel des

cls.
TreeMap(SortedMap m) Construit un Map contenant les mmes lments
que le SortedMap spcifi, tri selon le mme ordre.
TreeMap(Map m) Construit un Map contenant les mmes lments que le
Map spcifi, tri selon l'ordre naturel des cls.
TreeMap(Comparator c) Construit un Map vide, tri selon le Comparator
spcifi.

Mthodes
Object firstKey()Retourne la premire cl (plus basse) actuellement
dans ce Map tri.

SortedMap tailMap(Object fromKey) Retourne une vue de la partie du

Map, dont les cls sont suprieures ou gales fromKey.


Object lastKey() Retourne la dernire cl (plus lve) actuellement
dans ce Map tri.
SortedMap headMap(Object toKey) Retourne une vue de la partie du Map,
dont les cls sont strictement infrieures toKey.

Exemple
import java.util.*;
public class TreeMapDemo {
public static void main(String[] args) {
if(args.length < 1) {
System.out.println("Usage : java TreeMapDemo <sample string>");
System.exit(0);
}
Map WordList = new HashMap();
for(int count = 0;count < args.length; count++) {
// Get the next word
String key = args[count];
// Get the frequency of the word referred by "key"
Integer frequency = (Integer)WordList.get(key);
/* If the word does not exists in the map then initialize frequency to 1
else increment it by 1*/
if(frequency == null) {
frequency = new Integer(1);}
else { int value = frequency.intValue();
frequency = new Integer(value + 1);
}
// Update the frequency for the word referred by "key"
WordList.put(key, frequency);
}
// Display the words and its corresponding frequency
Map sortedWordList = new TreeMap(WordList);
System.out.println(sortedWordList);
}
}

Abdallah EL ASMAR

Page 23

Programmation Java : Patterns et bibliothques NFA035

Interface Map.Entry
Cette interface permet de modliser les couples (cl, valeur) d'une table de hachage. Elle expose deux
mthodes : getKey() et getValue(), qui retournent bien sr la cl et la valeur de ce couple.
La seule faon d'obtenir un objet de type Map.Entry est de faire un appel la mthode
Map.entrySet(), et d'itrer sur le Set obtenu en retour.
Cet objet est une vue sur la table. Il possde galement une mthode setValue(V value), qui permet
de modifier la valeur associe une cl durant une itration.
Parcourir une Map
Plusieurs solutions existent pour parcourir une interface Map.
Une bonne dmarche pour parcourir un objet implmentant linterface Map, est dutiliser les itrateurs
dfinis par linterface Iterator. Linterface Map propose trois mthodes qui retournent une Collection
partir de laquelle il est possible daccder un itrateur :

public Set entrySet();

retourne la liste des couples cl/valeur. Cet ensemble est lui aussi une
vue sur la table, qui reflte donc les modifications qui peuvent y tre faites. Il supporte les
oprations de retrait d'lments, mais pas les oprations d'ajout.
public Set keySet(); donne la liste des cls
public Collection values(); permet dobtenir la liste des valeurs

Lorsque lon parcourt une Map, il est souvent ncessaire de connatre la fois la cl et la valeur. Par
exemple on peut utiliser un itrateur dfinit sur le set retourn par keySet() :
Map map;
for ( Iterator i = map.keySet().iterator(); i.hasNext();) {
Cle cle = (Cle)i.next();
Valeur valeur = (Valeur)map.get(cle);
/* Utilisation des objets cle et valeur */
}

Ce bout de code fonctionne trs bien. Pourtant il nest pas optimal. En effet, on commence par rcuprer
la liste des cls. Puis pour chaque cl, on recherche la valeur correspondante. Or, il est prfrable de
rcuprer en une seule passe les cls et les valeurs. Pour cela il faut faire appel la mthode entrySet() :
Map map;
for ( Iterator i = map.entrySet().iterator(); i.hasNext();) {
Entry couple = (Entry)i.next();
Cle cle = (Cle)couple.getKey();
Valeur valeur = (Valeur)couple.getValue();
/* Utilisation des objets cle et valeur */
}

Abdallah EL ASMAR

Page 24

Programmation Java : Patterns et bibliothques NFA035


Linterface Iterable<T> et la boucle for each
Linterface Iterable du package java.lang indique quun objet peut tre parcouru par un itrateur.
Dfinition de Iterable<T>
public interface Iterable<T> {
Iterator<T> iterator();
}

Toute classe qui implmente Iterable peut tre parcourue par une boucle for each

Linterface Collection hrite Iterable, par suite toute classe qui implmente Collection peut tre
parcourue par une boucle for each

Boucle for each et boucle normale


Exemple: Parcourir la collection coll
Considrons que coll est une collection dobjets de la classe Personne
Avec une boucle normale :
Personne e;
String nom;
for (Iterator<Employe> it = coll.iterator(); it.hasNext(); ) {
e = it.next();
nom = e.getNom();
}

Avec une boucle for each :


String nom;
for (Employe e : coll) {
nom = e.getNom();
}

Syntaxe gnrale de for each


for (Typev v : expression)
instruction

Typev v : dclaration dune variable


expression : une expression dont lvaluation donne un tableau typeT[ ] ou un objet qui
implmente linterface Iterable<E>, tel que typeT ou E est affectable Typev
Restriction de for each
On ne dispose pas de la position dans le tableau ou la collection pendant le parcours
On ne peut pas modifier la collection pendant quon parcourt la boucle (alors que cest possible
par lintermdiaire de litrateur)

25

Programmation Java : Patterns et bibliothques NFA035

Algorithmes
L'ensemble des algorithmes manipulant les collections se trouve dans la classe Collections ( ne pas confondre
avec l'interface Collection). Cette classe consiste des mthodes statiques permettant de traiter des collections
(appliquer des algorithmes de recherche, de tri .) ou de retourner des collections.
Les mthodes de cette classe lancent lexception NullPointerException si lobjet pass en paramtre est
null.
Quelques mthodes de la classe Collections

<T extends Comparable<? super T>> void sort(List<T> liste) :

trier une liste en ordre

ascendant suivant lordre naturel des lments de cette liste.

<T> void sort(List<T> liste, Comparator<? super T> c):

trier une liste suivant lordre

dtermin par le comparateur spcifi.

void shuffle(List<T> liste)

: mlange les lments dune liste de manire alatoire.

void reverse(List<T> liste)

: inverse les lments de la liste.

void <T> fill(List<? super T> list, T obj)

: initialise les lments de la liste avec lobjet

spcifi.

void <T> copy(List<? super T> dest, List<? extends T> src) :

copy une liste src dans une

liste dest.

<T> int binarySearch(List<? extends Comparable<? super T>> list, T obj) :recherche

<T> int binarySearch(List<? extends Comparable<? super T>> list, T obj, Comparator<?
super T> c):recherche de lobjet obj dans une liste trie suivant lordre du comparateur. Si lobjet est

de
lobjet obj dans une liste trie en ordre ascendant. Si lobjet est trouv, la mthode retourne lindex de
cet objet, si non, elle retourne une valeur ngative.

trouv, la mthode retourne lindex de cet objet, si non, elle retourne une valeur ngative.

<T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll):

retourne llment minimum de la collection.

<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll):

retourne llment maximum de la collection.

Les interfaces Comparable et Comparator


Un algorithme extrmement rapide et stable (les lments quivalents ne sont pas rordonns) est utilis pour
trier la liste en utilisant l'ordre naturel du type. Le tri ne peut avoir lieu que si les classes implantent linterface
Comparable, ce qui n'est toujours pas le cas. Cette interface contient une seule mthode compareTo:
interface Comparable {
int compareTo(Object obj);
}

Cette mthode retourne:


- entier positif si l'objet qui fait l'appel est plus grand que obj,
- zro s'ils sont identiques,
- ngatif si l'objet qui fait l'appel est plus petit que obj.
26

Programmation Java : Patterns et bibliothques NFA035


Dans le cas d'une classe qui n'implante pas la classe Comparable, ou bien vous voulez spcifier un autre ordre,
vous devez implanter l'interface Comparator. Cette dernire permet de comparer deux lments de la collection.
interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object object);
}

Les mthodes : sort(List) et sort(List,Comparator).


5.2.1.1 - sort(List)
La mthode sort(List) trie la liste passe en paramtre en fonction de leur ordre naturel. Tous les lments de la
liste doivent implmenter l'interface Comparable, et donc redfinir la fonction compareTo(Object). Par exemple
:
public class Personne implements Comparable {
public String nom,prenom;
Personne(String nom, String prenom) {
this.nom=nom;
this.prenom=prenom;
}
public int compareTo(Object o) { // on redfinit compareTo(Object)
Personne p=(Personne)o;
if(nom.equals(p.nom)) {
return prenom.compareTo(p.prenom);
}
return nom.compareTo(p.nom);
}
}

Supposons ensuite une liste l de Personne, pour la trier, il suffira d'appeler Collections.sort(l).
La mthode sort(List, Comparator) trie la liste passe en paramtre en fonction du Comparator pass en
paramtre. Supposons la classe Personne prcdemment dfinie (sans implmenter Comparable). Il faut crer
une classe implmentant l'interface Comparator, et donc redfinissant les mthodes compare(Object,Object) et
equals(Object), comme cet exemple :
import java.util.Comparator;
public class MonComparator implements Comparator{
MonComparator(){
}
public int compare(Object arg0, Object arg1){
Personne p1 = (Personne) arg0;
Personne p2 = (Personne) arg1;
int result = p1.name.compareTo(p2.name);
if(result==0) result = p1.prenom.compareTo(p2.prenom);
return result;
}
}

Il suffit alors, pour trier ma liste l, d'appeler Collections.sort(l,new MonComparator()).

27

Programmation Java : Patterns et bibliothques NFA035


La classe Arrays
Cette classe (package java.util) expose des mthodes utilitaires qui traitent des tableaux. On peut trier ces
mthodes dans les catgories suivantes. D'une faon gnrale, il existe une version de chacune de ces
mthodes pour tous les types primitifs Java, ainsi que pour la classe Object.
La premire mthode expose n'entre dans aucune catgorie. Elle permet de convertir un tableau en List :
asList(Object[] tab). Attention toutefois, la liste retourne ne supporte pas l'ajout d'objet !
Utilisation de Arrays.asList(...)
// jusqu'ici tout va bien...
List<String> list = Arrays.asList("Un",

"Deux",

"Trois") ;

// gnration d'une UnsupportedOperationException !!!


list.add("Quatre") ;

Recherche d'un lment dans un tableau : mthodes binarySearch(int[] tab, int key). Il existe
une version supplmentaire qui prend en paramtre deux index entre lesquels la recherche doit se
limiter. Ces mthodes retournent l'index de l'lment recherch.

Copie d'un tableau dans un autre : mthodes copyOf(int[] original, int newLength). Ces
mthodes retournent un nouveau tableau, dans lequel les cases vides sont initialises null, ou la
valeur par dfaut de chaque type primitif.

Copie d'une partie de tableau dans un nouveau tableau : mthodes copyOfRange(int[] original,
int from, int to). Le nouveau tableau de la bonne taille est retourn.

Comparaison de deux tableaux, lment par lment : equals(int[] tab1, int[] tab2). Retourne
true si les lments de ces tableaux sont gaux deux deux.

Initialisation d'un tableau : fill(int[] tab, int val) et fill(int[] tab, int fromIndex, int
toIndex, int val). Ces mthodes ne retournent rien, c'est le tableau pass en paramtre qui est
modifi.

Calcul du code de hachage d'un tableau : hashCode(int[] tab) : retourne le code de hachage du
tableau pass en paramtre.

Tri d'un tableau : sort(int[] tab) et sort(int[] tab, int fromIndex, int toIndex) : tri le
tableau pass en paramtre en fonction du type du tableau. Si le tableau est un tableau d'objets, alors les
objets doivent tre Comparable.

Mthode toString() pour les tableaux : toString(int[] tab).

28

Programmation Java : Patterns et bibliothques NFA035


import java.util.*;
class ArraysDemo {
public static void main(String []arg){
int A[] = new int [10];
for (int i =0; i <10; i++){
A[i] = -3 * i;
}
System.out.print("Original contents : ");
display (A);
Arrays.sort(A);
System.out.print("Sorted : "); display (A);
Arrays.fill(A, 2, 6, -1);
System.out.print("After fill : "); display (A);
Arrays.sort(A);
System.out.print("After Sorting again : "); display (A);
System.out.print("Location of the value -9 is : ");
int index = Arrays.binarySearch(A, -9);
System.out.println(index);
}
static void display(int [] M){
for (int i =0; i <M.length; i++)
System.out.print(M[i] + " ");
System.out.println(" ");
}
}

29

Programmation Java : Patterns et bibliothques NFA035

Programmation vnementielle
Graphical user interfaces (GUI)

1. GUI concepts et exemples


1.1.

Objets de GUI

Une interface graphique en Java est cre, au moins, avec trois types d'objets :
Composant (Component)
vnement (Event)
Ecouteur (Listener)
Un composant GUI est un objet qui dfinit un lment de l'cran pour afficher des informations ou de
permettre l'utilisateur d'interagir avec un programme d'une certaine manire.
Exemples de composants GUI : bouton (Button), champ de texte (Textfield), tiquette (Label), barre de
dfilement (Scroll bar), et menu (Menu).
Un conteneur (Container) est un type spcial de composant qui est utilis pour regrouper et organiser
d'autres composants. Un cadre (Frame) et un applet sont des exemples de composants conteneur.
Un vnement est un objet qui reprsente un acte, un fait qui survient, duquel nous pourrions tre
intresss. Souvent, les vnements correspondent aux actions de l'utilisateur, par exemple en appuyant
sur un bouton de la souris ou en appuyant sur une touche sur le clavier. La plupart des composants de GUI
gnrent des vnements pour indiquer une action de l'utilisateur associe ce composant. Par exemple,
un lment reprsentant un bouton gnre un vnement pour indiquer qu'il a t pouss. Un programme
qui est orient autour d'une interface graphique, en rponse aux vnements de l'utilisateur, est appel
vnementielle.
Un couteur (listener) est un objet qui est "en attente" pour un vnement de se produire et qui peuvent
rpondre en quelque sorte quand il le fait. Le programmeur doit tablir avec soin les relations entre le
listener, l'vnement associ, et le composant qui gnre l'vnement.

1.2.

Cration d'interfaces graphiques

Pour crer un programme Java qui utilise une interface graphique, il faut :
Dfinir et mettre en place les lments ncessaires,
Crer des objets couteur et tablir la relation entre les couteurs et les composants qui gnrent les
vnements, et
Dfinir ce qui se passe la suite de diverses interactions utilisateur pouvant survenir.
Java possde deux packages de GUI, l'original Abstract Windows Toolkit (AWT) et la plus rcente Swing.
AWT utilise les routines de fentre du systme d'exploitation natif et par consquent l'effet visuel dpend
de la plate-forme du systme d'excution.
Swing permet dutiliser trois modes : un look and feel "Java" [par dfaut], le look de la plate-forme native
ou un look spcifique de la plate-forme. Swing repose sur les objets originaux et le framework de
lAWT. Les composants Swing ont le prfixe J pour les distinguer de ceux de l'AWT (par exemple,
JFrame au lieu de Frame).
Pour inclure les composants et les mthodes Swing dans un programme, on doit importer les packages
suivants : java.awt.*;
java.awt.event.*;
javax.swing.*;
30

Programmation Java : Patterns et bibliothques NFA035

1.3.

Exemples

1.3.1. Exemple 1
Cet exemple consiste dun frame qui regroupe un bouton et un label, le label affiche la valeur dun compteur
des cliques du bouton, chaque clique incrmente cette valeur de 1.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PushCounter extends JFrame {
private int pushes;
private JLabel label;
private JButton push;
PushCounter( ){
setSize (300, 100);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
pushes = 0;
push = new JButton ("Push me!");
push.addActionListener (new ButtonListener());
label = new JLabel ("Pushes: " + pushes);
Container cp = getContentPane();
cp.setBackground (Color.cyan);
cp.setLayout (new FlowLayout());
cp.add (push);
cp.add (label);
setVisible(true);
}
private class ButtonListener implements ActionListener {
public void actionPerformed (ActionEvent event) {
pushes++;
label.setText("Pushes " + pushes); }
}
public static void main(String arg[]){
new PushCounter();
}
}

1.3.2. Exemple 2
Cet exemple consiste dun frame qui regroupe deux boutons, deux textfields et deux labels, il permet de saisir
une valeur de temprature en Celsius et la transformer en Fahrenheit et reciproquement.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FahrenheitGUI {
private int WIDTH = 450, HEIGHT = 100;
private JFrame frame;
private JPanel panel;
31

Programmation Java : Patterns et bibliothques NFA035


private JLabel inputLabel, outputLabel;
private JTextField fahrenheit, celcius;
private JButton ftoc, ctof;
public FahrenheitGUI() {
frame = new JFrame ("Temperature Conversion");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
inputLabel = new JLabel ("Fahrenheit:");
outputLabel = new JLabel ("Celcius: ");
celcius = new JTextField (5);
fahrenheit = new JTextField (5);
ftoc = new JButton ("F -->> C");
ctof = new JButton ("C -->> F");
ftoc.addActionListener (new TempListener());
ctof.addActionListener (new TempListener());
panel = new JPanel();
panel.setPreferredSize (new Dimension(WIDTH, HEIGHT));
panel.setBackground (Color.yellow);
panel.add (inputLabel);
panel.add (fahrenheit);
panel.add (ftoc);
panel.add (ctof);
panel.add (outputLabel);
panel.add (celcius);
frame.getContentPane().add (panel);
frame.pack();
frame.setVisible(true);
}
private class TempListener implements ActionListener {
public void actionPerformed (ActionEvent event) {
double fahrenheitTemp, celciusTemp;
String text;
Object ob = event.getSource();
if (ob == ftoc) {
text = fahrenheit.getText();
fahrenheitTemp = Double.parseDouble(text);
celciusTemp = (fahrenheitTemp-32) /1.8;
text = Double.toString(celciusTemp) ;
celcius.setText (affiche(text));
}
else if (ob == ctof) {
text = celcius.getText();
celciusTemp = Double.parseDouble(text);
fahrenheitTemp = (celciusTemp * 1.8) + 32;
text = Double.toString(fahrenheitTemp) ;
fahrenheit.setText (affiche(text));
}
} }
private static String affiche(String str){
int p = str.indexOf('.');
if (p <0 ) return str;
else return str.substring(0,p) + str.substring(p, p+2);
}
public static void main (String [ ] args) {
FahrenheitGUI converter = new FahrenheitGUI( );}
}

32

Programmation Java : Patterns et bibliothques NFA035

2. Conteneurs (Containers)
Les conteneurs servent regrouper des composants tels que les champs de texte et des cases cocher.
Conteneurs affichables sont des conteneurs de niveau suprieur tels que les JFrame, JWindow, JDialog,
JApplet et JInternalFrame, qui s'interfacent avec le gestionnaire de fentres du systme d'exploitation.
Conteneurs non-affichables sont de grands rcipients tels que JPanel, JOptionPane, JScrollPane et
JTabbedPane, qui organisent la disposition de la structure quand plusieurs contrles sont utiliss.

2.1.

JFrame

Ce conteneur est gnralement utilis pour les applications GUI autonome. JFrame s'affiche dans une fentre
spare avec sa propre barre de titre.
Variables
public static final int EXIT_ON_CLOSE : reprsente l'opration par dfaut de sortie de
lapplication quand la fentre est ferme.
Constructeurs
public JFrame()
public JFrame (String title): cre un frame avec la barre de titre spcifi.
Mthodes
public void setDefaultCloseOperation (int opration): contrle de l'action qui se produit lorsque
l'utilisateur clique sur l'icne fermer . La constante utilise est normalement
EXIT_ON_CLOSE.
public Container getContentPane() : retourne le Content Pane pour du frame. Le Content Pane
reprsente le conteneur primaire pour la JFrame.
Mthodes de Container:
public void setBackground(Color color)
public void setLayout (LayoutManager); BorderLayout est le gestionnaire de
disposition ( layout) par dfaut de JFrame.
public Component add(Component item)
public JMenuBar getJMenuBar()
public void setJMenuBar setJMenuBar(JMenuBar menuBar)
public setVisible(boolean flag): Rendre le frame visible ou invisible.
public void pack( ) : la mthode pack dimensionne le frame pour monter les composants qui lui
ont t ajoutes.
Public void setSize( int width, int height)
Public void setTitle (String titleBar)

2.2.

JPanel

Un panel est un conteneur ; mais, contrairement un frame, il ne peut tre affich tout seul. Un panel doit tre
ajout un autre conteneur. Son rle est d'aider organiser les composants dans une interface graphique.
Constructeurs
public JPanel()
public JPanel(LayoutManager manager)
Cre un panel avec le gestionnaire de disposition spcifie, qui est par dfaut flow layout.
Mthodes
public void setBackground(Color color)
public void setLayout (LayoutManager); FlowLayout is the default layout of JPanel.
33

Programmation Java : Patterns et bibliothques NFA035


public Component add(Component item)
public Component add(String str, Component item)
public void setPreferredSize(Dimension size); (Un objet Dimension encapsule la largeur et la
hauteur dun composant dans un seul objet ; Dimension(int largeur, int hauteur))

3. JLabel, JButton, JTextField


3.1. JLabel
Une tiquette (Label) est un non-interactif composant qui affiche une ligne de texte dans une interface
graphique. Les tiquettes sont gnralement utilises pour afficher des informations ou pour identifier les
autres composants de l'interface GUI.
Constructeurs
public JLabel()
public JLabel(String text) : dfinit le texte initial du label.
Mthodes
public String getText()
public void setText(String text)
Obtient ou modifi le texte affich du label.

3.2.

JButton

Un bouton est un composant que l'utilisateur clique pour dclencher une action spcifique.
Constructeurs
public JButton (String text)
Mthodes
public void addActionListener (ActionListener listener)
public String getText() : obtient le texte affich sur le bouton.
public void setText (String text): dfinit le texte affich sur le bouton.
public void setEnabled (boolean indicateur): active ou dsactive le bouton.

3.3.

JTextField

Un champ de texte est un composant qui affiche une zone dans laquelle l'utilisateur peut taper une seule
ligne d'information. Les champs de texte sont utiliss dans les programmes GUI comme un moyen
d'accepter des entres.
Constructeurs
public JTextField)
public JTextField (int colonnes)
public JTextField (String text)
public JTextField (String text, int colonnes)
Cre un champ de texte avec le texte initial spcifi et d'une taille initiale encadre par le
nombre de colonnes spcifi.
Mthodes
public void addActionListener (ActionListener listener)
public String getText() : obtient le texte affich par le champ de texte.
public void setText (String text): dfinit le texte affich par le champ de texte.
public void setEditable (boolean)

4. Les vnements et les couteurs


Souvent, les vnements correspondent aux actions de l'utilisateur, par exemple en appuyant sur un bouton de
34

Programmation Java : Patterns et bibliothques NFA035


la souris ou en appuyant sur une touche sur le clavier. Un couteur (listener) est un objet qui est "en attente"
pour un vnement de se produire et qui peut rpondre en quelque sorte quand il se produit.
Pour rpondre un vnement, on doit faire deux choses : crer un objet couteur pour l'vnement et ajouter
cet couteur au composant graphique qui gnre l'vnement.
L'objet couteur peut contenir une mthode qui est appele par le composant chaque fois que cet vnement
se produit.
Dans l'exemple 1 :
Un JButton gnre un vnement d'action lorsqu'il est appuy. C'est pourquoi nous avons besoin d'un couteur
d'vnements. Dans ce programme, nous dfinissons la classe ButtonListener comme l'couteur pour cet
vnement. Dans le constructeur de la classe, l'objet couteur est instanci et puis il est ajout au bouton
l'aide de la mthode addActionListener.
Une technique courante pour crer un objet couteur est de dfinir une classe qui implmente une interface
couteur. La bibliothque standard de classes de Java contient un ensemble d'interfaces pour diverses
catgories d'vnements. Par exemple, l'interface pour un vnement d'action sappelle ActionListener.
ActionListener
L'interface ActionListener ne spcifie qu'une seule mthode, appele actionPerformed. Cette mthode
actionPerformed prend un paramtre de type ActionEvent.
Lorsque le bouton est enfonc, l'objet JButton appelle la mthode actionPerformed de lcouteur qui lui a t
ajout. L'objet JButton gnre un objet ActionEvent et il passe dans la mthode actionPerformed. Si
ncessaire, un couteur peut obtenir des informations sur l'vnement de ce paramtre.
ActionEvent
Mthodes
public String getActionCommand() : retourne la chane de commande (nom du bouton ou la
valeur du champ de texte) associe cette action
public Object getSource (): retourne l'objet qui gnre l'vnement.
Quelques interfaces listener
Interfaces Listener
Evnements

Signatures de mthodes abstraites


(To be overridden)

gnrs by
JButton, JTexField
JMenuItem,

ActionListener

public void actionPerformed(ActionEvent e)

JCheckbox,
JCheckboxMenuItem,

ItemListener

public void itemStateChanged(ItemEvent e)

JFrame, JPanel,
JWindow, JDialog,

MouseListener

public
public
public
public
public

JFrame, JPanel,
JWindow, JDialog,

MouseMotionListener

public void mouseDragged(MouseEvent e)


public void mouseMoved(MouseEvent e)

JTextField

TextListener

public void textValueChanged(TextEvent e)

35

void
void
void
void
void

mouseClicked(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)

Programmation Java : Patterns et bibliothques NFA035


public
public
public
public

JDialog, JFrame

WindowListener

void
void
void
void

windowActivated(WindowEvent e)
windowClosed(WindowEvent e)
windowClosing(WindowEvent e)
windowDeactivated
(WindowEvent e)
public void windowDeiconified
(WindowEvent e)
public void windowIconified
(WindowEvent e)
public void windowOpened(WindowEvent e)

5. Gestionnaires de disposition
Un Gestionnaire de disposition est un objet qui gre la faon dont les composants sont disposs dans un
conteneur. Il dtermine la taille et la position de chaque composant et peut prendre plusieurs facteurs en
considration pour le faire. Chaque conteneur possde un gestionnaire de disposition par dfaut, nous
pouvons le remplacer si nous prfrons par un autre.
Le gestionnaire de disposition d'un conteneur est consult, chaque fois qu'un changement l'aspect visuel de
son contenu pourrait tre ncessaire. Une fois la taille d'un conteneur est rgle, par exemple, le gestionnaire
de disposition est consult pour dterminer comment tous les lments dans le conteneur doivent apparatre
dans le conteneur redimensionn. Chaque fois qu'un composant est ajout un conteneur, le gestionnaire de
disposition dtermine comment l'ajout affecte tous les composants existants.
Gestionnaires de disposition prdfinis
Gestionnaires de
disposition
BorderLayout
FlowLayout
GridLayout
GridBagLayout
CardLayout
BoxLayout

Description
Organise les lments dans cinq zones (North, South, East,
West, Center).
Organise les lments de gauche droite, partir de
nouvelles lignes si ncessaire.
Organise les composants dans une grille de lignes et de
colonnes.
Organise les composants dans une grille de cellules,
permettant aux composants s'tendre sur plus d'une cellule.
Organise les composants dans un domaine tel quun seul est
visible tout moment.
Organise les lments dans une seule ligne ou colonne.

L'exemple suivant est une application qui illustre l'utilisation et les effets de trois gestionnaires de mise en
page : FlowLayout, BorderLayout et GridLayout.

36

Programmation Java : Patterns et bibliothques NFA035


import javax.swing.*;
public class LayoutDemo {
public static void main (String[] args) {
JFrame frame = new JFrame ("Layout Manager Demo");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
JTabbedPane tp = new JTabbedPane();
tp.addTab ("Flow", new FlowPanel());
tp.addTab ("Border", new BorderPanel());
tp.addTab ("Grid", new GridPanel());
frame.getContentPane().add(tp);
frame.pack();
frame.setVisible(true);
}
}

FlowLayout
Flow layout est un des gestionnaires les plus faciles utiliser. Par dfaut, la classe JPanel utilise FlowLayout.
Ce gestionnaire place les composants autant que possible sur une ligne, leur taille par dfaut. Lorsqu'un
composant ne peut tenir sur une ligne, elle est place sur la ligne suivante.
Variables
public final static int CENTER
public final static int LEFT
public final static int RIGHT
Valeurs constantes indiquant les zones du gestionnaire de disposition FlowLayout.
Constructeurs
public FlowLayout()
public FlowLayout(int al)
public FlowLayout(int al, int hg, int vg)
Cre une nouvelle instance de FlowLayout et lui donne al alignement (centr par dfaut) avec un
cart horizontal hg et verticale vg (valeur par dfaut 0).
La classe suivante reprsente le panel illustrant FlowLayout. Elle dfinit explicitement la disposition pour
une mise en page FlowLayout (mme si dans ce cas, c'est inutile parce que FlowLayout est le layout par
dfaut de JPanel).
public class FlowPanel extends JPanel {
public FlowPanel ( ) {
JButton b1, b2, b3, b4, b5;
setLayout (new FlowLayout());
setBackground (Color.green);
b1 = new JButton ("BUTTON 1");
b2 = new JButton ("BUTTON 2");
b3 = new JButton ("BUTTON 3");
b4 = new JButton ("BUTTON 4");
b5 = new JButton ("BUTTON 5");
add (b1); add (b2); add (b3); add (b4); add (b5); }
}

37

Programmation Java : Patterns et bibliothques NFA035

BorderLayout
BorderLayout a cinq zones auquel les composants peuvent tre ajouts : North, South, East, West, et Center.
Les zones ont une relation particulire et positionnelle les uns aux autres. Les quatre zones externes
deviennent aussi grandes que ncessaire pour tenir compte des composants qu'ils contiennent. Si aucun des
composants ne sont ajouts au North, South, East, ou West, ces zones ne prennent pas aucune espace du
conteneur. La zone Center se dveloppe pour remplir l'espace disponible.
La mthode add pour un conteneur gr par BorderLayout prend comme premier paramtre l'lment
ajouter. Le second paramtre indique la zone laquelle il est ajout. La zone est spcifie l'aide de
constantes dfinies dans le BorderLayout classe.
Variables
public final static String CENTER
public final static String EAST
public final static String NORTH
public final static String SOUTH
public final static String WEST
Valeurs constantes indiquant les zones du BorderLayout.
Constructors
public BorderLayout()
public BorderLayout(int hgap, int vgap)
Cre une nouvelle instance d'un BorderLayout. Si aucun cart horizontal et vertical initial n'est spcifi,
ils sont initialiss par dfaut zro.
public class BorderPanel extends JPanel {
public BorderPanel( ){
JButton b1, b2, b3, b4, b5;
setLayout (new BorderLayout());
setBackground (Color.green);
b1 = new JButton ("BUTTON 1");
b2 = new JButton ("BUTTON 2");
b3 = new JButton ("BUTTON 3");
b4 = new JButton ("BUTTON 4");
b5 = new JButton ("BUTTON 5");
add (b1, BorderLayout.CENTER);
add (b2, BorderLayout.NORTH);
add (b3, BorderLayout.SOUTH);
add (b4, BorderLayout.EAST);
add (b5, BorderLayout.WEST);
}
}

38

Programmation Java : Patterns et bibliothques NFA035

GridLayout
GridLayout prsente les composants d'un conteneur dans une grille rectangulaire de lignes et de colonnes. Un
composant est plac dans chaque cellule de la grille, et toutes les cellules ont la mme taille.
Il n'y a aucun moyen pour assigner explicitement un lment un emplacement particulier dans la grille autre
que l'ordre dans lequel ils sont ajouts au conteneur.
Constructeurs
GridLayout() public
public GridLayout (int r, int c)
public GridLayout (int r, int c, int hg, int vg)
Cre une nouvelle instance d'un GridLayout avec une dimension de r lignes et de colonnes c (valeur par
dfaut 1 par chacune). Les cellules de la grille ont un cart horizontal de hg pixel et un cart vertical de vg
pixel (si aucun cart horizontal et vertical initial ne sont pas spcifis, ils sont initialiss par dfaut zro).
public class GridPanel extends JPanel {
public GridPanel( ) {
JButton b1, b2, b3, b4, b5;
setLayout (new GridLayout (2, 3));
setBackground (Color.green);
b1 = new JButton ("BUTTON 1");
b2 = new JButton ("BUTTON 2");
b3 = new JButton ("BUTTON 3");
b4 = new JButton ("BUTTON 4");
b5 = new JButton ("BUTTON 5");
add (b1); add (b2); add (b3); add (b4); add (b5);
}
}

6. Bote de dialogue (Dialog boxes)


Une bote de dialogue est une fentre graphique qui s'ouvre au dessus de n'importe quelle fentre actuellement
active, afin que l'utilisateur peut interagir avec elle. Une bote de dialogue peut servir aux cas suivants :
- transmettre certaines informations,
- confirmer une action
- permet l'utilisateur dentrer des informations.
Une bote de dialogue a gnralement un but unique, cest assurer une interaction brve avec l'utilisateur.
La classe JOptionPane simplifie la cration et l'utilisation des botes de dialogue de base.
Les formats de base pour une bote de dialogue JOptionPane relvent de trois catgories :
Une bote de dialogue message affiche simplement une chane de sortie.
Une bote de dialogue d'entre prsente une invite et un champ de saisie de texte unique dans
laquelle l'utilisateur peut entrer une chane de caractres.
Une bote de dialogue de confirmation prsente l'utilisateur avec une simple question de oui
ou non .
39

Programmation Java : Patterns et bibliothques NFA035

JoptionPane
Fournit des mthodes pour crer des botes de dialogue standard.
Constantes
public static final int CANCEL_OPTION
public static final int OK_OPTION
public static final int YES_OPTION
Renvoie une valeur si un bouton d'option spcifique est choisi.
public static final int CLOSED_OPTION
Renvoie une valeur si l'utilisateur ferme la fentre sans rien slectionner.
public static final int DEFAULT_OPTION
public static final int YES_NO_OPTION
public static final int YES_NO_CANCEL_OPTION
public static final int OK_CANCEL_OPTION
Spcifie les types de boutons utiliser dans la bote de dialogue.
public static final int ERROR_MESSAGE
public static final int INFORMATION_MESSAGE
public static final int WARNING_MESSAGE
public static final int QUESTION_MESSAGE
public static final int PLAIN_MESSAGE
Spcifie un style de message.
Mthodes
public static void showConfirmDialog (Component parent, Object message)
public static void showConfirmDialog(Component parent, Object message, String title, int
buttonSet)
public static void showConfirmDialog(Component parent, Object message, String title, int
buttonSet, int messageStyle)
Affiche une bote de dialogue permettant l'utilisateur de confirmer une option. Elle utilise le
message spcifi, le titre, le jeu de boutons (par dfaut YES/NO/CANCEL) et le style de message.
Si le composant parent est null, la zone est centre sur l'cran.
public static void showInputDialog(Component parent, Object message)
public static void showInputDialog(Component parent, Object message, String title, int
messageStyle)
public static void showInputDialog(Object message)
Affiche une bote de dialogue permettant l'utilisateur d'entrer des donnes. Elle utilise le message
spcifi, le titre et le style de message. Le contenu du champ texte est retourn.
public static void showMessageDialog(Component parent, Object message)
public static void showMessageDialog ( Component parent, Object message, String title, int
messageStyle)
Affiche une bote de dialogue prsentant un message. Elle utilise le message spcifi, le titre et le
style de message.
40

Programmation Java : Patterns et bibliothques NFA035

Exemple de JOptionPane
Le programme suivant utilise chacun de ces types de botes de dialogue.
import javax.swing.JOptionPane;
public class EvenOdd {
//----------------------------------// Dtermine si la valeur entre par l'utilisateur est pair ou impair.
// Utilise plusieurs botes de dialogue pour l'interaction de
l'utilisateur.
//----------------------------------public static void main (String[] args){
String numStr, result;
int num =0, again;
do {
do{
try{
numStr = JOptionPane.showInputDialog (null, "Enter a positive
integer: ");
num = Integer.parseInt(numStr);
}catch (NumberFormatException e){
JOptionPane.showMessageDialog(null, e, "Error message",
JOptionPane.ERROR_MESSAGE); }
} while(num <=0);
result = "That number is " + ((num%2 == 0) ? "even" : "odd");
JOptionPane.showMessageDialog (null, result);
again = JOptionPane.showConfirmDialog (null, "Do Another?");
while (again == JOptionPane.CANCEL_OPTION){
JOptionPane.showMessageDialog (null, "You must choose YES or NO",
"Error message",JOptionPane.ERROR_MESSAGE );
again = JOptionPane.showConfirmDialog (null, "Do Another?");
} while (again == JOptionPane.YES_OPTION);
}
}

7. JmenuBar, JMenu, JMenuItem


Une barre de menus est une des parties les plus visibles de l'application GUI. C'est un groupe de commandes
situ dans diffrents menus. Pour implmenter une barre de menus, nous utilisons trois objets : JMenuBar,
JMenu et JMenuItem.
Constructeurs
JMenuBar()
JMenu (String menuName)
JMenuItem (String menuItemName)
Mthodes
setJMenuBar (JMenuBar): mthode de JFrame, permettant d'ajouter une barre de menus une JFrame
add (JMenu) : mthode de JMenuBar, permettant d'ajouter un menu une barre de menus.
add (JMenuItem) : mthode de JMenu, permettant d'ajouter un menuItem un menu.
add (JMenu) : mthode de JMenu, permettant d'ajouter un sous-menu un menu.
Un sous-menu est juste comme tout autre menu normal. Il est cr de la mme manire. Nous ajoutons
41

Programmation Java : Patterns et bibliothques NFA035

simplement un menu au menu existant.


addSeparator( ): mthode de JMenu, permettant d'ajouter un sparateur.
Un sparateur est une ligne verticale qui spare visuellement les lments de menu. De cette faon
nous pouvons regrouper des lments dans certains endroits logiques.
addActionListener(ActionListener) : mthode de JMenuItem, permettant d'ajouter un ActionListener.

import java.awt.*; import java.awt.event.*; import


javax.swing.*;
public class MenuDemo extends JFrame implements ActionListener {
private JList list;
private JTextArea text;
private JMenuBar mbar;
private JMenu m1, m2;
private JMenuItem i1, i2, i3, i4, i5, i6;
private JPanel panel;
private String [] villes = {"Beyrouth", "Saida", "Tripoli" };
public MenuDemo(){
setTitle("Example of menus");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
mbar = new JMenuBar();
m1 = new JMenu("Menu Test");
i1 = new JMenuItem("Copy");
i1.addActionListener(this);
m1.add(i1);
i2 = new JMenuItem("Empty area");
i2.addActionListener(this);
m1.add(i2);
m1.addSeparator();
m2 = new JMenu("Utilities");
i4 = new JMenuItem("Utility 1"); m2.add(i4);
i5 = new JMenuItem("Utility 1"); m2.add(i5);
m1.add(m2);
m1.addSeparator();
i3 = new JMenuItem("Exit"); i3.addActionListener(this);
m1.add(i3);
mbar.add(m1);
setJMenuBar(mbar);
panel = new JPanel();
list = new JList(villes);
panel.add(list);
text = new JTextArea(3,12); panel.add(text);
add(panel, BorderLayout.SOUTH);
setSize(400,300);
setVisible(true);
}
public void actionPerformed (ActionEvent evt){
String s = evt.getActionCommand();
if (s.equals("Exit")) System.exit(0);
else if (s.equals("Copy")){
String r = villes[list.getSelectedIndex()];
text.append(r);}
else if (s.equals("Empty area")) text.setText("");
}
public static void main (String [] args) {
new MenuDemo();
}
}

42

Programmation Java : Patterns et bibliothques NFA035

8. Autres composants
JTextArea
Reprsente une zone de plusieurs lignes d'affichage ou de modification du texte.
Constructeurs
public JTextArea()
public JTextArea(int rows, int columns)
public JTextArea(String text)
public JTextArea(String text, int rows, int columns)
Cre une zone de texte avec le texte initial spcifi et d'une taille initiale rgie par le nombre spcifi
de lignes et de colonnes.
Mthodes
public String getText() : obtient le texte affich par TextArea.
public void setText (String text): dfinit le texte affich par TextArea.
public void setEditable (boolean)
public void append (String str): ajoute la chane spcifie la fin du document dans TextArea.
public void insert(String str, int position): insre la chane spcifie dans le document de TextArea
la position spcifie.
public int getColumns()
public void setColumns(int columns)
public int getRows()
public void setRows(int rows)
Obtient ou dfinit le nombre de lignes ou colonnes pour TextArea.
public int getLineCount() : retourne le nombre de lignes de TextArea.

Check boxes
Une case cocher est un bouton qui peut tre activ et dsactiv l'aide de la souris, ce qui indique qu'une
certaine condition logique est active ou dsactiv. Bien quon puisse avoir un groupe de cases cocher
indiquant un ensemble d'options, chaque case cocher fonctionne de faon autonome. Autrement dit,
chacun peut tre sur ON ou OFF et le statut d'un n'influe pas sur les autres.
Constructeurs
public JCheckBox (String text)
public JCheckBox (String text, boolean tat)
Cre une case cocher avec le texte spcifi et tat slectionn (ce qui est par dfaut non slectionns).
Mthodes
public boolean isSelected ()
Lorsqu'une case cocher change d'tat de ON (coche) OFF (non coche), ou vice versa, il gnre un
vnement ItemEvent. L'couteur correspondant pour l'vnement ItemEvent est l'interface ItemListener.

43

Programmation Java : Patterns et bibliothques NFA035

ItemListener & ItemEvent


L'interface ItemListener contient une seule mthode appele itemStateChanged.
public void itemStateChanged (ItemEvent event)
La classe ItemEvent
Constantes
public static final int DESELECTED
public static final int SELECTED
Constantes qui reprsentent la dslection ou la slection d'un composant.
Mthodes
public Object getItem(): retourne l'lment qui a dclench lvnement.
public int getStateChange() : retourne le type de changement d'tat (slection ou dslection) qui
a dclench cet vnement.
import javax.swing.*;
public class StyleOptions {
public static void main (String[] args){
JFrame styleFrame = new JFrame ("Style Options");
styleFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
StyleGUI gui = new StyleGUI();
styleFrame.getContentPane().add (gui.getPanel());
styleFrame.pack(); styleFrame.setVisible(true); }
}
import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class StyleGUI {
private final int WIDTH = 300, HEIGHT = 100, FONT_SIZE = 36;
private JLabel saying;
private JCheckBox bold, italic;
private JPanel primary;
public StyleGUI() {
saying = new JLabel ("Say it with style!");
saying.setFont (new Font ("Helvetica",Font.PLAIN, FONT_SIZE));
bold = new JCheckBox ("Bold");bold.setBackground (Color.cyan);
italic = new JCheckBox ("Italic");
italic.setBackground (Color.cyan);
StyleListener listener = new StyleListener();
bold.addItemListener (listener);
italic.addItemListener (listener);
primary = new JPanel(); primary.add (saying);
primary.add (bold);
primary.add (italic);
primary.setBackground (Color.cyan);
primary.setPreferredSize (new Dimension(WIDTH, HEIGHT));
}
public JPanel getPanel(){
return primary;}
private class StyleListener implements ItemListener {
public void itemStateChanged (ItemEvent event){
int style = Font.PLAIN;
if (bold.isSelected()) style = Font.BOLD;
if (italic.isSelected())style += Font.ITALIC;
saying.setFont (new Font ("Helvetica", style,
FONT_SIZE)); }
} }

44

Programmation Java : Patterns et bibliothques NFA035


Ce programme utilise la classe Font, qui reprsente une police de caractres (Font) particulire. Un objet de
Font est dfini par le nom, le style et la taille de la Font.
Les cases cocher dans cette interface graphique sont configures pour modifier le style du font utilis
(Helvetica).
Le style dun font est reprsent comme un entier, la classe Font dfinit les constantes entires PLAIN (style
ordinaire), BOLD et ITALIC. La somme Font.BOLD + Font.ITALIC est utilise pour reprsenter un style
bold et italic la fois.

Radio buttons
Les Radio buttons fonctionnent comme un groupe, ils fournissent un ensemble d'options mutuellement
exclusives. A tout moment, un et un seul bouton du groupe est slectionne (on).
import javax.swing.*;
public class QuoteOptions {
public static void main (String[] args){
JFrame quoteFrame = new JFrame ("Quote Options");
quoteFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
QuoteGUI gui = new QuoteGUI();
quoteFrame.getContentPane().add (gui.getPanel());
quoteFrame.pack();
quoteFrame.setVisible(true);
}
}
import javax.swing.*; import java.awt.*; import java.awt.event.*;
public class QuoteGUI {
private final int WIDTH = 300, HEIGHT = 100;
private JPanel primary;
private JLabel quote;
private JRadioButton comedy, philosophy, carpentry;
private String comedyQuote = "Take my horse, please.";
private String philosophyQuote = "I think, therefore I am.";
private String carpentryQuote = "Measure twice. Cut once.";
public QuoteGUI() {
quote = new JLabel (comedyQuote);
quote.setFont (new Font ("Helvetica", Font.BOLD, 24));
comedy = new JRadioButton ("Comedy", true);
comedy.setBackground (Color.green);
philosophy = new JRadioButton ("Philosophy");
philosophy.setBackground (Color.green);
carpentry = new JRadioButton ("Carpentry");
carpentry.setBackground (Color.green);
ButtonGroup group = new ButtonGroup();
group.add (comedy); group.add (philosophy); group.add
(carpentry);
QuoteListener listener = new QuoteListener();
comedy.addActionListener (listener);
philosophy.addActionListener (listener);
carpentry.addActionListener (listener);
primary = new JPanel();
primary.add (quote);primary.add (comedy); primary.add
(philosophy);
primary.add (carpentry);
primary.setBackground (Color.green);
primary.setPreferredSize (new Dimension(WIDTH, HEIGHT));
}
45

Programmation Java : Patterns et bibliothques NFA035


public JPanel getPanel() {
return primary;
}
private class QuoteListener implements ActionListener {
public void actionPerformed (ActionEvent event){
Object source = event.getSource();
if (source == comedy) quote.setText (comedyQuote);
else if (source == philosophy) quote.setText
(philosophyQuote);
else quote.setText (carpentryQuote);
}
}
}

Notez que chaque bouton est ajout un groupe et que chaque bouton est ajout individuellement au Panel.
Un objet ButtonGroup n'est pas un conteneur pour organiser et afficher des composants ; C'est simplement un
moyen de dfinir le groupe de radio buttons qui travaillent ensemble pour former un ensemble d'options
dpendants. L'objet ButtonGroup assure quun RadioButton actuellement slectionn sera dsactiv lorsquun
autre RadioButton dans le groupe est slectionn.
Un RadioButton produit un vnement ActionEvent lorsqu'il est slectionn. La mthode actionPerformed de
lcouteur dtermine d'abord la source de l'vnement l'aide de la mthode getSource et compare ensuite
chacun des trois RadioButtons. Le texte de Label est modifi selon quel bouton a t slectionn.
Notez que Checkbox et RadioButton produisent des types d'vnements diffrents. Un Checkbox vnement
ItemEvent et un RadioButton produit un vnement ActionEvent. L'utilisation de types d'vnements
diffrents est lie aux diffrences de fonctionnalit du bouton. Un Checkbox produit un vnement lorsqu'il
est slectionn ou dslectionn, et lcouteur pouvait faire la distinction entre les deux cas. Par contre, un
RadioButton ne produit un vnement que lorsqu'il est slectionn (le RadioButton actuellement slectionn
du groupe est dslectionn automatiquement).

9. La hirarchie de classes de Component


Toutes les classes Java qui dfinissent des composants GUI font partie d'une hirarchie de classes. Presque
tous les composants Swing GUI sont drives de la classe la JComponent, qui dfinit comment tous les
composants fonctionnent en gnral. JComponent est drive de la classe Container, qui son tour, est
drive de la classe de Component.
Container et Component sont des classes originales de AWT. La classe Component contient une grande partie
de la fonctionnalit gnrale qui s'applique tous les composants de GUI, tels que la peinture de base et la
gestion des vnements. Donc mme si nous prfrons utiliser des composants Swing spcifiques, ces
composants sont bass sur les concepts de base de AWT et rpondent aux mmes vnements en tant que
composants AWT. Parce qu'ils sont drivs de Container, nombreux composants Swing peuvent servir
comme des conteneurs, mme dans la plupart des cas, ces capacits sont rduites. Par exemple, un objet
JLabel peut contenir une image, mais il ne peut pas tre utilis comme un conteneur gnrique auquel les
composants peuvent tre ajouts.

46

Programmation Java : Patterns et bibliothques NFA035

Partie de la hirarchie de classes de Component de GUI

Nombreuses fonctionnalits qui s'appliquent tous les composants Swing, sont dfinies dans la classe
JComponent et sont hrites dans ses descendants. Par exemple, nous avons la possibilit de mettre une
bordure sur un composant Swing. Cette capacit est dfinie, une seule fois, dans la classe JComponent et elle
est hrite par les classes qui en sont drive, directement ou indirectement.
Certaines classes telles que JPanel et JLabel, sont directement drives de JComponent. Autres classes de
Component sont imbriques plus bas dans la structure de hirarchie d'hritage. Par exemple, la classe
JAbstractButton est une classe abstraite qui dfinit les fonctionnalits qui s'applique tous les types de
boutons de GUI. JButton est driv directement de lui. JCheckBox et JRadioButton sont tous deux drivs
d'une classe appele JToggleButton, qui incarne les caractristiques communes pour les boutons qui peuvent
tre dans l'un des deux tats.
La classe JtextField est l'un des nombreux composants Java GUI qui prennent en charge la gestion des
donnes de texte. Ils sont organiss sous une classe appele JTextComponent.
La plupart des classes Swing utilisent une mthode appele paintComponent pour effectuer une peinture
personnalise. Habituellement, nous s'inspirent d'un JPanel en utilisant sa mthode paintComponent et utiliser
le super rfrence pour appeler la version de la mthode paintComponent dfinie dans JComponent, qui
dessine l'arrire-plan et le contour du composant.

47

Programmation Java : Patterns et bibliothques NFA035

10. vnements de souris


Java divise les vnements gnrs par lutilisation de la souris en deux catgories : les vnements de souris
MouseEvent et les vnements de mouvement de sourisMouseMotionEvent.

vnements de souris et vnements de mouvement de souris


vnement de souris
Description
Souris enfonce (Mouse pressed) Le bouton de la souris est enfonc.
Souris relche (Mouse released) Le bouton de la souris est relch.
Souris clique (Mouse clicked)
Le bouton de la souris est enfonc et relch sans
dplacement de la souris entre les deux actions.
Souris entre (Mouse entered)
Le pointeur de la souris est dplac sur le
composant.
Souris sortie (Mouse exited)
Le pointeur de la souris est dplac loin du
composant.
vnement de mouvement de souris Description
Souris dplace (Mouse moved)
La souris est dplace.
Souris trane (Mouse dragged)
La souris se dplace alors que le bouton de la
souris est enfonc.

Lorsquon clique sur le bouton de la souris sur un composant Java GUI, trois vnements sont gnrs :
- un vnement, quand le bouton de la souris est enfonc (Mouse pressed)
- et deux vnements, lorsque le bouton est relch (mouse released et mouse clicked).
Appuyez et relchez le bouton de la souris dans le mme emplacement correspond un clic de souris. Si
vous appuyez sur le bouton de la souris, dplacez la souris et puis relchez le bouton de la souris,
lvnement souris clique (mouse clicked) n'est pas gnr.
Un composant gnre un vnement de souris entre (mouse entered) lorsque le pointeur de la souris passe
dans l'espace graphique. De mme, il gnre un vnement de souris sortie (mouse exited) quand le
pointeur de la souris quitte cet espace.
Les
48

Programmation Java : Patterns et bibliothques NFA035


vnements de mouvement de souris, comme son nom indique, se produisent lorsque la souris se dplace.
- L'vnement de Souris dplace (Mouse moved) indique simplement que la souris se dplace.
- L'vnement de Souris trane (Mouse dragged) est gnr lorsque l'utilisateur a appuy sur le bouton
de la souris et dplac la souris sans relcher le bouton. Les vnements de mouvement de souris sont
gnrs plusieurs fois, trs rapidement, tandis que la souris se dplace.
Exemple : MousePressed
Le programme suivant rpond un seul vnement de la souris. Plus prcisment, il dessine un point vert
l'emplacement du pointeur de la souris chaque fois que lutilisateur sappuie sur le bouton de la souris.

import javax.swing.*;
public class Dots {
public static void main (String[] args) {
JFrame dotsFrame = new JFrame ("Dots");
dotsFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
dotsFrame.getContentPane().add (new DotsPanel());
dotsFrame.pack();
dotsFrame.show();
}
}

La mthode main de la classe Dots cre un frame et lui ajoute un panel. Ce panel est dfini par la classe
DotsPanel qui reprsente une sous-classe de JPanel. Ce panel sert comme la surface sur laquelle sont
dessins les points.

49

Programmation Java : Patterns et bibliothques NFA035


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class DotsPanel extends Jpanel {
private final int WIDTH = 300, HEIGHT = 200;
private final int RADIUS = 6;
private ArrayList pointList;
private int count;
public DotsPanel(){
pointList = new ArrayList();
count = 0;
addMouseListener (new DotsListener());
setBackground (Color.black);
setPreferredSize (new Dimension(WIDTH, HEIGHT));
}
public void paintComponent (Graphics page) {
super.paintComponent(page);
page.setColor (Color.green);
// Retrieve an iterator for the ArrayList of points
Iterator pointIterator = pointList.iterator();
while (pointIterator.hasNext()){
Point drawPoint = (Point) pointIterator.next();
page.fillOval (drawPoint.x - RADIUS, drawPoint.y RADIUS,
RADIUS * 2, RADIUS * 2);
}
page.drawString ("Count: " + count, 5, 15);
}
private class DotsListener implements MouseListener {
public void mousePressed (MouseEvent event){
pointList.add (event.getPoint());
count++;
repaint();
}
public void mouseClicked (MouseEvent event) {}
public void mouseReleased (MouseEvent event) {}
public void mouseEntered (MouseEvent event) {}
public void mouseExited (MouseEvent event) {}
}
}

La classe DotsPanel fournit une liste d'objets Point qui reprsentent toutes les localits au cours de laquelle
l'utilisateur a cliqu sur la souris. Une classe Point reprsente les coordonnes (x, y) d'un point donn dans
l'espace deux dimensions. Il offre un accs public pour les variables x et y du point. Chaque fois que le
panel est dessin, tous les points enregistrs dans la liste sont dessins. La liste est maintenue comme un objet
ArrayList. Pour dessiner les points, un objet itrateur est obtenu partir de l'instance ArrayList afin que
chaque point puisse tre trait son tour.
Lcouteur de l'vnement Souris enfonce est dfini comme une classe interne prive qui implmente
l'interface MouseListener. La mthode mousePressed est appele par le panel chaque fois que l'utilisateur
sappuie sur le bouton de la souris alors que le pointeur de la souris est au dessus du panel.
Un vnement de souris se produit toujours un moment donn dans l'espace, et l'objet qui reprsente cet
50

Programmation Java : Patterns et bibliothques NFA035


vnement conserve la trace de cet emplacement. Dans un couteur de souris, nous pouvons obtenir et utiliser
ce point chaque fois que nous en avons besoin. Dans le programme de points, chaque fois que la mthode
mousePressed est appele, l'emplacement de l'vnement est obtenu l'aide de la mthode getPoint de l'objet
MouseEvent. Ce point est stock dans ArrayList et le panel est ensuite redessin.
Notez que, contrairement aux interfaces ActionListener et ItemListener qui contiennent chacune une seule
mthode, l'interface MouseListener contient cinq mthodes. Pour ce programme, le seul vnement qui nous
intresse est l'vnement Souris press (mouse pressed). Par consquent, la seule mthode dans lequel nous
avons tout intrt est la mthode mousePressed. Cependant, quand on implmente une interface, on doit
fournir des dfinitions pour toutes les mthodes de l'interface. Alors, on a fourni des mthodes vides
correspondant aux autres vnements. Lorsque ces vnements sont gnrs, ces mthodes vides sont
appeles, mais aucun code n'est excut.
Exemple : MoussePressed & MousseDragged
Regardons un exemple qui rpond deux vnements de la souris. Le programme RubberLines dessine une
ligne entre deux points.
Le premier point est dtermin par l'emplacement auquel la souris est enfonce pour la premire fois. Le
deuxime point nest pas dtermin tant quon dplace la souris en maintenant le bouton de la souris appuye.
Lorsque le bouton est relch, le deuxime point est dtermin et une ligne est trace entre ces deux points.
Quand le bouton de la souris est enfonc nouveau, une nouvelle ligne est cre.
Le panel sur lequel les lignes sont dessines est reprsent par la classe RubberLinesPanel. Parce que on doit
couter les deux vnements Souris appuye (mouse pressed) et souris trane (mouse dragged), on a besoin
d'un couteur qui rpond la fois aux vnements de souris et aux vnements de mouvement de souris.
Alors, la classe d'couteur implmente les interfaces MouseMotionListener et MouseListener. Il doit donc
implmenter toutes les mthodes de ces deux classes. Les deux mthodes d'intrt, mousePressed et
mouseDragged, sont mises en uvre, et les autres sont prsentes sans dfinitions.
import javax.swing.*;
public class RubberLines extends JFrame {
private final int WIDTH = 400, HEIGHT = 300;
public RubberLines(){
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (WIDTH, HEIGHT);
getContentPane().add (new RubberLinesPanel());
setVisible(true);
}
public static void main(String arg[]){
new RubberLines();}
}

51

Programmation Java : Patterns et bibliothques NFA035


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RubberLinesPanel extends JPanel {
private Point point1 = null, point2 = null;
public RubberLinesPanel(){
LineListener listener = new LineListener();
addMouseListener (listener);
addMouseMotionListener (listener);
setBackground (Color.black);
}
public void paintComponent (Graphics page) {
super.paintComponent (page);
page.setColor (Color.green);
if (point1 != null && point2 != null)
page.drawLine (point1.x, point1.y, point2.x, point2.y);
}
private class LineListener implements MouseListener,
MouseMotionListener {
public void mousePressed (MouseEvent event){
point1 = event.getPoint();
}
public void mouseDragged (MouseEvent event) {
point2 = event.getPoint();
repaint();
}
public void mouseClicked (MouseEvent event) {}
public void mouseReleased (MouseEvent event) {}
public void mouseEntered (MouseEvent event) {}
public void mouseExited (MouseEvent event) {}
public void mouseMoved (MouseEvent event) {}
}
}

Lorsque la mthode mousePressed est appele, la variable point1 est dfinie. Alors, tant que la souris se
dplace, la variable point2 est continuellement se change et le panel est redessin.
Notez que, dans le constructeur de RubberLinesPanel, l'objet couteur est ajout au panel deux fois: une fois
comme un couteur de souris et puis comme un couteur de mouvement de souris.
La mthode appele pour ajouter l'couteur doit correspondre l'objet pass comme paramtre. Dans ce cas,
on a eu un objet qui a servi comme couteur pour les deux catgories d'vnements. On aurait pu obtenir deux
classes d'couteur: un couteur des vnements de souris et un couteur des vnements de mouvement de
souris. Un composant peut avoir plusieurs couteurs pour diverses catgories d'vnements.
Notez galement que ce programme dessine une seule ligne la fois. Autrement dit, lorsque l'utilisateur
commence tracer une autre ligne avec un nouveau clic de souris, l'autre disparat. C'est parce que la mthode
paintComponent redessine son arrire-plan, liminant la ligne chaque fois. Pour visualiser les lignes
prcdentes, nous devrons garder une trace d'elles, ventuellement l'aide d'un ArrayList, comme on a fait
dans le programme de points.

52

Programmation Java : Patterns et bibliothques NFA035

11. Extension de classes adaptateur dvnement


Une autre technique pour la cration d'une classe d'couteur est de crer une sous-classe dune classe
adaptateur dvnement. Java dfinit pour chaque interface couteur qui contient plusieurs mthodes, une
classe adaptateur qui contient dj les dfinitions vides pour toutes les mthodes de l'interface.
Pour crer un couteur, on peut driver une nouvelle classe d'couteur de la classe de l'adaptateur appropri et
redfinir les mthodes d'vnement qui nous intresse. Utilisant cette technique, on peut viter de fournir des
mthodes non utilises avec des dfinitions vides.
Le programme suivant est un frame qui rpond aux vnements de la souris. Chaque fois que l'utilisateur
clique sur le bouton de la souris sur le frame, une ligne est trace partir de l'emplacement du pointeur de la
souris vers le centre du frame. La distance que la ligne reprsente en pixels est affiche.
La structure du programme centr est semblable celui du programme RubberLines. Il charge un panel
d'affichage, reprsent par la classe OffCenterPanel dans le frame.
La classe d'couteur, au lieu d'implmenter linterface MouseListener directement, elle tend la classe
MouseAdapter, qui est dfinie dans le package java.awt.event.
La classe MouseAdapter implmente l'interface MouseListener et contient des dfinitions vides pour toutes
les mthodes d'vnement de souris. Dans notre classe d'couteur, on a redfinit la dfinition de la mthode
mouseClicked pour rpondre nos besoins.

import javax.swing.*;
public class OffCenter extends JFrame {
private final int WIDTH = 300;
private final int HEIGHT = 300;
public OffCenter(){
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setSize (WIDTH, HEIGHT);
getContentPane().add (new OffCenterPanel());
setVisible(true);
}
public static void main(String arg[]){
new OffCenter();
}
}

53

Programmation Java : Patterns et bibliothques NFA035


import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
public class OffCenterPanel extends JPanel {
private DecimalFormat fmt;
private Point current;
private int centerX, centerY;
private double length;
public OffCenterPanel (int width, int height){
addMouseListener (new OffCenterListener());
centerX = width / 2; centerY = height / 2;
fmt = new DecimalFormat ("0.##");
setBackground (Color.yellow);
}
public void paintComponent (Graphics page){
super.paintComponent (page);
page.setColor (Color.black);
page.drawOval (centerX-3, centerY-3, 6, 6);
if (current != null){
page.drawLine (current.x, current.y, centerX, centerY);
page.drawString ("Distance: " + fmt.format(length), 10,
15);
}
}
private class OffCenterListener extends MouseAdapter {
public void mouseClicked (MouseEvent event){
current = event.getPoint();
length = Math.sqrt(Math.pow((current.x-centerX), 2) +
Math.pow((current.y-centerY), 2));
repaint();
}
}
}

54

Programmation Java : Patterns et bibliothques NFA035

12. Le patron Observateur (Observer)


Intention
Le patron de conception Observateur (Observer ou Publish-Subscribe) dfinit une dpendance un-plusieurs entre des objets, de faon que lorsqu'un objet change dtat, tous ses objets dpendants soient
notifis et mis jour automatiquement.
Les objets qui observent les changements d'tat de lobjet observ sont appels Observateurs. L'objet
observ est appel Sujet.
Motivation
La ncessit de maintenir la consistance entre des objets relis sans pour autant trop coupler les classes.
Nous voulons souvent afficher des donnes dans plusieurs formes en mme temps et avoir tous les
affichages refltent les modifications apportes ces donnes. Par exemple, on peut reprsenter des
changements de prix de l'action par un graphe et par un tableau ou une liste. A chaque changement de prix,
nous nous attendrions que ces deux reprsentations soient changes la fois sans aucune intervention de
notre part.
Applicabilit :
Utiliser ce patron dans les situations suivantes :
Quand une abstraction a deux aspects, lun dpendant de lautre. Les encapsuler dans des objets
spars permet de les varier et de les rutiliser indpendamment lun de lautre
Quand le changement dun objet demande le changement dautres objets
Quand un objet doit notifier dautres objets sans faire dhypothse sur la nature de ces autres objets.
Structure
Le patron de conception Observateur suppose que l'objet qui contient les donnes (Sujet) est spar des
objets qui affichent les donnes (Observateurs), et que les Observateurs observent les modifications de ces
donnes.
Chacun de ces Observateurs enregistre son intrt dans les donnes en appelant une mthode publique du
Sujet. Ensuite, chaque Observateur possde une interface connue que le Sujet lui fait appel lorsque les
donnes changent.

Sujet

Observer

ajouterOb
supprimerOb
notifierObs

miseAjour

ObserverConcret
SujetConcret
miseAjour

55

Programmation Java : Patterns et bibliothques NFA035


Participants
Le sujet :
Garde une trace de ses observateurs
Propose une interface pour ajouter ou enlever des observateurs
Lobservateur :
Dfinit une interface pour la notification de mises jour
Le sujet concret :
Cest lobjet observ
Enregistre son tat intressant les observateurs
Envoie une notification ces observateurs quand il change dtat
Lobservateur concret :
Il observe lobjet concret
Il stocke ltat qui doit rester consistent avec celui de lobjet observ
Il implmente linterface de mise jour permettant son tat de rester consistent avec celui de
lobjet observ
import java.util.*;
public class Sujet {
private List<Observer> listObs = new LinkedList<Observer>();
public void ajouterOb (Observer ob) {
listObs.add(ob);
}
public void supprimerOb (Observer ob) {
listObs.remove(ob);
}
protected void notifierObs() {
for(Observer ob : listObs) {
ob.miseAjour(); }
}
}
public class SujetConcret extends Sujet {
int value = 0;
public void setValue (int val) {
value = val;
notifierObs();
}
public int getValue() {
return value;
}
}
public interface Observer {
public void miseAjour();
}

56

Programmation Java : Patterns et bibliothques NFA035

public class ObserverConcretA implements Observer {


private int value = 0;
private SujetConcret subj;
public void setSujet(SujetConcret ob) {
subj = ob;
}
public void miseAjour() {
value = subj.getValue();
}
public void afficher() {
System.out.println("ObserverConcretA contient " + value);
}
}
public class ObserverConcretB implements Observer {
// La mme comme ObserverConcretA
}
public class ObserverPattern {
public static void main(String[] args) {
SujetConcret sujC = new SujetConcret();
ObserverConcret obA = new ObserverConcretA();
ObserverConcretB obB = new ObserverConcretB();
sujC.ajouterOb(obA);
sujC.ajouterOb(obB);
obA.setSujet(sujC);
obB.setSujet(sujC);
obA.afficher();
obB.afficher();
sujC.setValue(4);
obA.afficher();
obB.afficher();
}
}

Implmentation du pattern Observer en java


Java fournit les classes Observable/Observer comme support pour coder ce patron.
La classe java.util.Observable est la classe de base pour coder le sujet. Toute classe qui veut tre observe
tend cette classe de base.
Elle fournit les mthodes pour ajouter / ter des observateurs
Elle fournit des mthodes pour notifier les observateurs des changements
Une sous-classe a juste besoin dassurer que les observateurs sont notifis dans les mthodes changeant
ltat de lobjet observ.
Utilise un Vector pour stocker les rfrences aux observateurs.
57

Programmation Java : Patterns et bibliothques NFA035


Linterface java.util.Observer est linterface qui doit tre implmente par les classes qui veulent tre des
observateurs.
La classe java.util.Observable

public Observable()
Construit un objet observable avec initialement 0 observateurs

public synchronized void addObserver(Observer obs)


Ajoute un observateur lensemble des observateurs de cet objet

public synchronized void removeObserver(Observer obs)


Ote un observateur de lensemble des observateurs de cet objet

protected synchronized void setChanged()


Indique que cet objet a chang

protected synchronized void clearChanged()


Indique que cet objet na plus chang, ou quil a dj notifi ses observateurs des derniers changements.
Cette mthode est appele automatiquement par notifyObservers()

public synchronized boolean hasChanged ()


Test si lobjet a chang. Renvoie vrai si setChanged() a t appel plus rcemment que clearChanged()
sur cet objet. Faux sinon.

public void notifyObservers(Object arg)


Si lobjet a chang alors notifie tous les observateurs et ensuite appel clearChanged(). Chaque
observateur reoit une demande dexcution de sa mthode update() avec deux arguments : lobjet
observable qui a chang, et largument arg. Ce dernier peut tre utilis pour indiquer quel attribut de
lobjet observ a chang.

public void notifyObservers()


Idem que ci-dessus, mais le paramtre arg est positionn null. Cest--dire que lobservateur ne reoit
aucune information sur ce qui a chang dans lobjet observ.
Linterface java.util.Observer

Public abstract void update(Observable o, Object arg)


Cette mthode est appele chaque fois que ltat de lobjet observ est chang. Une application appelle
la mthode notifyObservers de lobjet observ pour permettre tous ses observateurs dtre notifis du
changement
import java.util.*;
public class SujetConcret extends Observable {
int value = 0;
public void setValue(int val) {
value = val;
setChanged();
notifyObservers();
}
public int getValue() {
return value;
}
}
58

Programmation Java : Patterns et bibliothques NFA035

import java.util.*;
public class ObserverConcretA implements Observer {
private int value = 0;
public void update(Observable ob, Object oo) {
value = ((ConcreteSubject)ob).getValue();
}
public void display() {
System.out.println("ConcreteObserverA contains " + value);
}
}
public class ObserverConcretB implements Observer {
// La mme comme ObserverConcretA
}

public class ObserverPattern {


public static void main(String[] args) {
SujetConcret sujC = new SujetConcret();
ObserverConcret obA = new ObserverConcretA();
ObserverConcretB obB = new ObserverConcretB();
sujC. addObserver (obA);
sujC. addObserver (obB);
obA.afficher();
obB.afficher();

sujC.setValue(4);
obA.afficher();
obB.afficher();

}
}

13. MVC (Model View Controller)


La conception modle-vue-contrleur (MVC) est introduite pour dcoupler les accs aux donnes et le logique
mtier de la manire dans laquelle il est affich l'utilisateur. Plus prcisment, MVC peut tre dcompos en
trois lments :
Modle - le modle reprsente les donnes et les rgles qui rgissent l'accs et mises jour de ces donnes.
Vue la vue restitue le contenu d'un modle. Elle spcifie exactement comment les donnes du modle
doivent tre prsentes. Si les donnes de modle sont modifies, la vue doit actualiser sa prsentation au
besoin. La vue s'enregistre avec le modle pour les notifications de modifications. Le modle doit tre
capable d inscrire les vues et il doit tre capable de notifier toutes les vues enregistres lorsquune de
ses fonctions causent son tat d'tre chang.
Contrleur - le contrleur est li la vue ; Il traduit les interactions de l'utilisateur avec la vue par des
actions que le modle doit les raliser. Pour un GUI, les interactions utilisateur pourraient tre de clics de
bouton ou de slections de menu.
59

Programmation Java : Patterns et bibliothques NFA035


Une fois qu'un utilisateur interagit avec la vue, les actions suivantes se produisent :
La vue reconnat qu'une action de GUI s'est produite, l'aide d'une mthode d'couteur qui est
enregistre pour tre appele lorsqu'une telle action se produit.
La vue appelle la mthode approprie sur le contrleur.
Le contrleur accde au modle, ventuellement, il le modifie de manire approprie l'action de
l'utilisateur.
Si le modle a t modifi, il notifie toutes les vues, du changement. Dans certaines architectures, le
contrleur peut galement tre responsable de la mise jour de la vue.

En gnral le modle ne sagit pas dune seule classe, il peut tre constitu de plusieurs instances de plusieurs
classes.
Consquences
Le MVC permet davoir plusieurs vues sur le mme modle
Il facilite le support pour de nouveaux clients
Il suffit dimplmenter une nouvelle vue, un nouveau contrleur et les connecter au modle existant
MVC et les patrons de conception
Le patron MVC est compos en plusieurs patrons
Sil y a plusieurs vues, elles peuvent tre organises dans un arbre en utilisant le patron composite
La relation entre les vues et les modles est le patron observer
Les contrleurs sont des strategy des vues
Mais encore
Le modle est souvent un mediator
Larbre des vues contient des decorators pour ajouter des proprits aux vues
Une vue utilise un adaptor pour convertir le modle en une interface quelle peut utiliser
Des vues crent des contrleurs avec un factory
60

Programmation Java : Patterns et bibliothques NFA035


En Java :
Un modle est constitu d'une ou plusieurs classes qui tendent la classe java.util.Observable. Cette
superclasse fournira l'infrastructure de Inscrire/Notifier ncessaire pour prendre en charge un ensemble
de vues.
Les vues sont construites des composants AWT ou SWING et elles doivent implmenter l'interface
java.util.Observer.
Les contrleurs sont les couteurs dans la structure d'vnement de Java.
Comment a marche
Tout d'abord, vous crivez un modle qui tend java.util.Observable. Vous crivez des accesseurs de classe
pour obtenir des informations sur son tat actuel et vous crivez des mutateurs pour mettre jour l'tat.
Chaque mutateur doit appeler setChanged() et un ou l'autre de notifyObservers() aprs qu'il en a fait modifi
l'tat. NotifyObservers() enverra un message de mise jour chaque observateur enregistr (vue).
Vous pouvez ensuite crer une ou plusieurs vues. Chaque vue doit implmenter l'interface
java.util.Observer et donc appliquer la mthode update(Observable, Object). L'objet du second paramtre
servira recevoir des informations supplmentaires, sil est utilis.
La vue doit galement s'inscrire avec le modle qu'il souhaite observer en utilisant la mthode
addObserver() du modele. Le modle se souviendra de toutes les vues, afin qu'il puisse en informer (mise
jour) plus tard.
Un modle peut avoir plusieurs vues. MVC a t cr spcifiquement pour permettre cela. Aussi, une vue
peut s'inscrire auprs de plusieurs modles et obtenir des mises jour de chacun d'eux.
Il n'est pas ncessaire de construire votre modle afin qu'il soit un seul Observable. Au lieu de cela,
plusieurs pices du modle peuvent tre sparment observables, chaque partie avec ses propres
observateurs.
Exercice
Considrons le code suivant:
public class Square {
private static double inchUnit = 2.54;
private double side;
public Square (double x){side = x;}
public double getSideCm(){ return side; }
public double getSideInch(){ return (side / inchUnit); }
public void setSideCm(double x) {side = x;}
public void setSideInch(double x) {side = x * inchUnit;}
}
public class SquareTest{
public static void main(String args[]) {
Square ss = new square (5);
new ControlSquare(ss); new GuiCm(ss); new GuiInch(ss); }
}

Dfinir deux vues (JFrame), chacun delles contient un JLabel permettant dafficher le champ side de la
classe Square en centimtre pour la premire vue GuiCm et en Inch pour la seconde vue GuiInch .
Dfinir, aussi, la classe ControlSquare (JFrame) qui permet de modifier la valeur du champ side en
utilisant un JTextField pour entrer une nouvelle valeur et un JButton pour excuter lopration.
Toute modification de la valeur du champ side par la classe ControlSquare implique une modification de
valeurs affiches dans les vues GuiCm et GuiInch .

61

Programmation Java : Patterns et bibliothques NFA035

14. Le patron Adaptateur (Adaptor)


Ce patron permet de convertir l'interface d'une classe dans une autre interface comprise par la partie cliente. Il
permet des classes de fonctionner ensemble, ce qui n'aurait pas t possible sinon ( cause de leurs interfaces
incompatibles).
Alors la motivation dutiliser ce patron est la situation o un systme doit intgrer un sous-systme existant et
ce sous-systme a une interface non standard par rapport au systme.
Illustration du problme
Admettons l'existence d'une mthode permettant de mlanger une liste dlments :
<E> void shuffleList(List<E> list) { }
Est-il possible dutiliser cette mthode pour mlanger un tableau Java ?
Directement, cela nest clairement pas possible, les tableaux ntant pas des listes. Mais existe-t-il un moyen
indirect dy parvenir ?
Solution
Pour permettre lutilisation dun tableau Java l o une liste est attendue, il suffit dcrire une classe qui adapte
le tableau en le prsentant comme une liste.
Cette classe doit implmenter linterface List du paquetage java.util et effectuer les oprations de cette interface
directement sur le tableau quelle adapte.
Adaptateur pour tableaux
import java.util.List;
class ArrayAdapter<E> implements List<E> {
private E[] array;
public ArrayAdapter(E[] array) {
this.array = array;
}
public E get(int index) {
return array[index];
}
// ... les 22 autres mthodes de List
}

Une fois ladaptateur dfini, il est possible de lutiliser pour mlanger un tableau au moyen de la mthode de
mlange de liste<E> void shuffleList(List<E> list) { }:
String[] array = ;
List<String> adaptedArray = new ArrayAdapter<String>(array);
// mlange les lments de array.
shuffleList(adaptedArray);
Gnralisation
De manire gnrale, lorsquon dsire utiliser une instance dune classe A l o une instance dune classe B est
attendue, il est possible dcrire une classe servant dadaptateur.
Bien entendu, il faut que le comportement des classes A et B soit relativement similaire, sans quoi ladaptation
na pas de sens.
Le patron de conception Adaptor dcrit cette solution.
Exemple rel
La classe java.util.Arrays offre, sous la forme de mthodes statiques, un grand nombre doprations sur les
tableaux.
Une de ces mthodes, nomme asList, permet justement dadapter un tableau en liste. Cette mthode utilise le
patron
62

Programmation Java : Patterns et bibliothques NFA035


Adaptor pour faire cette adaptation, exactement comme nous lavons fait.
java.util.List
Linterface java.util.List contient 23 mthodes. Ecrire une classe implmentant cette interface reprsente donc
un travail important. Toutefois, un examen de cette interface montre dune part que 9 mthodes sont
optionnelles, et dautre part que plusieurs mthodes peuvent facilement sexprimer en termes dun petit nombre
de mthodes de base.
Oprations optionnelles

Dans la bibliothque Java, certaines interfaces possdent des mthodes correspondant des oprations
optionnelles.
Une classe implmentant une telle interface peut ne pas fournir ces oprations, c--d faire en sorte que les
mthodes correspondantes lvent l'exception UnsupportedOperationException.
Exemple: remove() de l'interface Iterator.
Dans la bibliothque Java, les mthodes qui modifient les structures de donnes sont en gnral optionnelles.
Cela permet la dfinition de structures de donnes non modifiables.
Ainsi, les mthodes add, addAll, clear, remove, removeAll, retainAll et set de linterface List sont optionnelles.
Mthodes de base de List

Linterface List possde plusieurs mthodes qui sont facilement exprimables en fonction de mthodes de base.
Par exemple, au moyen de la mthode size il est trivial de fournir la mthode isEmpty :
public boolean isEmpty() {
return size() == 0;
}
La classe AbstractList

Lide de la classe java.util.AbstractList est de dfinir autant de mthodes de List que possible en termes d'un
petit nombre de mthodes de base, qui sont laisses abstraites. Les mthodes correspondant des oprations
optionnelles lvent quant elle lexception UnsupportedOperationException.
En hritant de cette classe et en dfinissant les mthodes de base, on peut ainsi facilement dfinir un nouveau
type de listes.
Adaptateur pour tableaux

La classe AbstractList nous permet dcrire beaucoup plus simplement notre adaptateur pour tableaux.
Au lieu de dfinir les 23 mthodes de linterface List, il nous suffit dhriter dAbstractList et de dfinir les trois
mthodes de base requises : get, set et size.
import java.util.AbstractList;
class ArrayAdapter<E> extends AbstractList<E> {
private E[] array;
public ArrayAdapter(E[] array) {
this.array = array;
}
@Override
public E get(int index) { ??? }
@Override
public E set(int index, E element) { ??? }
@Override
public int size() { ??? }
}

63

Programmation Java : Patterns et bibliothques NFA035


Exercices Srie 1
Exercice 1
On voudrait implmenter une application de gestion de comptes bancaires. Pour simplifier, on
considre uniquement 2 types de comptes : compte dpargne et compte de carte de crdit. Les
classes correspondant sont donnes ci-dessous :
public class SavingAccount{
private double interest;
private double amount;
private String client;

public class CardAccount{


private double interest;
private double amount;
private String client;
private double overdrawn;
public SavingAccount(String c,
public CardAccount (String c, double i,
double i) {
double d) {
amount = 0.0;
amount = 0.0; interest = i;
interest = i; client=c;
client=c; overdrawn = d ;
}
}
public double getAmount() {
public double getAmount(){
return amount;
return amount;
}
}
public void deposit(double s){
public void deposit(double s){
amount = amount * (1+ interest
if(amount==0.0) return;
/100)+s;
amount += s;
}
}
public boolean withdraw(double s){
public boolean withdraw(double s){
if(amount >=s) {amount -=s;
s=s*(1+ interest);
return true; }
if(overdrawn+ amount>=s){
return false;
amount -=s; return true; }
}}
return false;
}}
Ces deux classes contiennent exactement les mmes mthodes. Certaines ont la mme
implmentation et dautres diffrent. Nous voulons en fait, manipuler des objets des deux classes
en utilisant un seul type de rfrence (faire une gnralisation). Par exemple :
Account a = new CardAccount("Bilal",7.5,2000); // or
Account a = new SavingAccount(("Samil",4, 2000, 5000)
a.getAmount() ; a.deposit(1000);
a) Implmenter la classe Account et rcrire les classes prcdentes. Vous devez ajouter la
classe Compte un attribut number, qui reprsentera le numro du compte et qui sera incrment
automatiquement la cration de chaque compte.
Cet attribut, ainsi que lattribut client doivent tre dclars publique sans toutefois avoir la
possibilit de changer leur valeur.

64

Programmation Java : Patterns et bibliothques NFA035


b) Implmenter une classe Bank qui contiendra une liste de comptes (Vector), une mthode
add(account a) et deux mthodes surcharges : Account search(String s) et Account search (int n)
qui renvoient respectivement les comptes ayant comme client s, et comme numro n.
N.B. On ne doit pas avoir plus quune seule instance de la classe Bank.
c) Tester cette application.
Exercice 2
On considre la classe Point suivant :
public class Point{
private int x,y ;
public Point(int x, int y){
this.x=x; this.y=y;
}
public int getX(){ return x; }
public int getY(){ return y; }
public void move(int dx, int dy){
x += dx; y += dy;
}
public String toString(){
return "["+x+","+y+"]";

}
La classe Line est dfinie par deux attributs privs de type Point. Le constructeur, reoit 4 entiers
(x1,y1,x2,y2) en paramtre pour crer ces deux points. Cette classe contient aussi deux
mthodes : move(int h) qui permet de dplacer la droite en haut ou en bas (augmenter ou
diminuer les valeurs des ordonnes (Y) de ses deux points) et la mthode toString() qui permet
de reprsenter une droite par son quation y= ax + b. Donc, dans toString(), vous devez calculer
a et b.
Pour les points (x , y ) et ( x , y ): a = (y y ) / (x x ) et b= y ax
1

a) Implmenter la classe Line. Un exemple dutilisation de cette classe :


Line d = new Line(2,2,3,4);
d.move(1);
System.out.println(d.toString());

On voudrait maintenant changer la reprsentation de Line. Ainsi, au lieu davoir 2 points comme
attributs, on veut reprsenter une droite par les coefficients a et b (rels) de son quation. Il faut donc,
changer limplmentation (les attributs et les corps du constructeur et des mthodes) de la classe Line
tout en gardant son interface publique (les enttes du constructeur et des mthodes) afin que le code
au-dessus fonctionne toujours.
b) Implmenter la nouvelle classe Line. (Pour la mthode move (int h), il suffit
daugmenter b par la valeur de h.)
c) Ajouter un nouveau constructeur qui initialise les attributs a et b.
d) Ajouter une mthode boolean perpendicular(Line d) qui renvoie true si la droite,
qui appelle la mthode, est perpendiculaire d. (ax+b et cx+d sont perpendiculaires si ac = -1).
e) Excuter nouveau la mthode main sans changer le code et remarquer que tout fonctionne
normalement.

Abdallah EL ASMAR

Page 65

Programmation Java : Patterns et bibliothques NFA035


Srie 2 Entres/Sorties
1. Ecrire un programme permettant dafficher la liste des noms de fichiers qui possdent
l'extension .java , du rpertoire (folder) C:\Exercises ,; le rpertoire peut contenir des
fichiers et sous- rpertoires, et chaque sous- rpertoires peut contenir des fichiers et des sousrpertoires.
2. Considrons le code suivant:
import java.io.*;
public class DataStudent {
public static void main (String arg[]) {
int [ ] number = {1, 2, 3};
String [] name = {"Sami","Karim", "Fadi"};
double [][] grades = {{12,13},{14, 15},{12.5,13.5}};
writeData(number, name, grades); readData (); }}

crire la mthode writeData() qui crit les donnes des tudiants au sein d'un nouveau fichier
et crire la mthode readData()qui lit et afficher les donnes de ce fichier.
3. Ecrire un programme qui compare deux fichiers texte ligne par ligne. La commande ligne
apparat comme a: java fileComp file1 file2
Chaque fichier source (file1 et file2) doit exister; Si non, afficher un message derreur et
quitter.
Lire une ligne de chaque fichier. Comparer ces deux lignes. Si elles sont identiques, continuer
avec les deux lignes suivantes. Si non, imprimer le numro de ligne et ces deux lignes et
continuer.
Si les deux fichiers nont pas le mme nombre de lignes (Par exemple: le nombre de lignes de
file1 est plus grand que celui de file2), pour chaque ligne supplmentaire du grand fichier
(file1) imprimer le numro de ligne, la ligne et le message End of File.
4. Ecrire un programme Java (fileCat.java) qui permet de crer un nouveau fichier par
concatnation de plusieurs fichiers. La commande ligne apparat comme a: java fileCat
source0 source1 source2 ... newFile
Dans la commande ligne, on peut avoir un fichier source ou plus. Chaque fichier source doit
exister (Si non, afficher un message derreur et quitter). Le dernier nom de la ligne, newFile,
est le nom du fichier crer.
Crer le nouveau fichier par ouverture des fichiers sources un la fois, en ordre, lire chaque
fichier byte par byte et crire chaque byte dans newFile. Utiliser buffered input et buffered
output.
une classe Etudiant qui possde les variables dinstance : Numro, Nom et un tableau
dentiers reprsentant les notes dun tudiant. Dfinir pour cette classe la mthode afficher()
qui permet dafficher le numro, le nom et la moyenne de notes. crire un programme
LineCounts.java qui va compter le nombre de lignes dans chaque fichier spcifi sur la ligne de
commande. Il est noter que plusieurs fichiers peuvent tre spcifis, par exemple :
crire un programme permettant de crer quelques instances de la classe Etudiant et de
sauvegarder ces instances dans un tableau. Ajouter deux mthodes, la premire permet de
sauvegarder les instances dans le fichier Etudiants.data , la deuxime permet de lire le
fichier et dafficher le numro, le nom et la moyenne de notes de chaque tudiant.

5. Crer

Abdallah EL ASMAR

Page 66

Programmation Java : Patterns et bibliothques NFA035


Srie 3 -collections
Exercice 1: tests sur les ArrayList
Lobjectif de cet exercice est de tester les principales oprations de la classe ArrayList. Pour cela,
commencez par aller sur la page qui dcrit la javadoc des ArrayList:
http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html. Dmarrez un nouveau projet Eclipse
contenant une classe Exo1 avec une mthode main.
Question 1
Dfinissez une mthode statique afficheListeSt( ArrayList<String> l) permettant dafficher une
arrayList de String. Dans la main, crez une arrayListe de String (noubliez pas dimporter java.util.*
):
ArrayList<String> ls = new ArrayList<String>();
Vous allez effectuer les oprations suivantes sur cette liste.
1. Ajoutez successivement les chanes 1, 2, 3, 4 , 5 et 6 dans la liste. Affichez la liste
avec la mthode afficheListeSt.
2. Remplacez llment de position 4 par la chane element remplace.
3. Ajoutez dans la position 3 la chane element ajoute.
4. Enlevez llment de position 2.
5. Affichez la liste aprs tous ces changements. Que constatez-vous?
6. Quel comportement si vous essayez denlever llment de position 20, ou dajouter un
lment la position 30?
Question 2
Ajoutez dans votre programme main le code suivant:
boolean b = ls.contains("4");
System.out.println("Contient 4 ? " + b);
int index = ls.indexOf("4");
if (index == -1)
System.out.println("Ne contient pas 4 " );
else
System.out.println("Contient 4 a la position : " + index );
ls.add("1");
ls.afficherListeSt();
int lastIndex = ls.lastIndexOf("1");
if (lastIndex == -1)
System.out.println("Ne contient pas 1 " );
else
System.out.println("Derniere occurrence de 1 a la
position : " + lastIndex );
Expliquez le comportement de ce code.
Question 3
Ajoutez la classe Cell donne plus bas dans votre projet.
public class Cell {
private int num;
public Cell( int i){
num = i;
}
public Cell(){
}

Abdallah EL ASMAR

Page 67

Programmation Java : Patterns et bibliothques NFA035


public int getNum(){ return num;}
public void afficher() {
System.out.println( num);
}
}

1. Ajoutez une mthode statique afficheListeCell permettant dafficher un arrayList de Cell.


2. Dans le main, crez une arrayList de Cell dans laquelle vous ajouterez successivement 5
cellules de numros 1 5. Affichez la liste.
3. En vous aidant de la documentation Java, expliquez les diffrences de comportement pour les
deux codes suivants, ajouter dans votre mthode main:
// Comparer le comportement de ce code :
Cell autrefois = new Cell(3);
if (lc.contains(autrefois))
System.out.println("Nouvelle cellule 3 dedans.");
else
System.out.println("Nouvelle cellule 3 pas dedans.");
int nindex = lc.indexOf(autrefois);
System.out.println("Indice trouve pour nouvelle cellule 3:"+ nindex );
// avec celui-ci
Cell trois = lc.get(4);
if (lc.contains(trois))
System.out.println("Cellule de meme adresse dedans.");
else
System.out.println("Pas dedans.");
int index3 = lc.indexOf(trois);
System.out.println("Indice trouve pour cellule meme adresse : "+index3 );

Exercice 2: quelques mthodes sur Set et itrateurs


Lobjectif de cet exercice est de tester les oprations spcifiques aux Set en Java.
http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html.
Dmarrez un nouveau projet Eclipse avec une classe Exo2 contenant une mthode main.
Question 1
On veut crire une mthode statique permettant dafficher nimporte quelle collection contenant des
String, par exemple, un ArrayList de String, un HashSet de String, etc. Ecrivez deux versions de cette
mthode: la premire utilise une boucle for-each; la deuxime utilise un itrateur. Dans la main, testez
votre mthode sur un ArrayListe et sur un HashSet que vous aurez dfini et initialis avec quelques
lments au pralable.
// Dans la main
ArrayList<String> ac = new ArrayList<String>();
HashSet<String> sc = new HashSet<String>();
// Ajout elements.
afficherCollSt(ac);
afficherCollSt(sc);

Question 2
Voici une implantation de la mthode afficheListeSt(ArrayList<String> c) de lexercice 1.
Est-il possible de reprendre le corps de cette mthode tel quel pour implanter la mthode
afficheCollSt(Collection<String> c) de la question 1? Expliquez votre rponse.
public static void afficherListeSt( ArrayList<String> liste){
for (int i= 0; i<liste.size(); i++){
System.out.println(liste.get(i));
}
}

Abdallah EL ASMAR

Page 68

Programmation Java : Patterns et bibliothques NFA035


Srie 4 - collections
Exercice 1
On voudrait implmenter une application de gestion de comptes bancaires de la banque
Liban Finance , il sagit de dfinir trois classes : CompteBancaire, CompteCourant et
CompteEpargne qui rpond aux points suivants :
Un compte bancaire est dcrit par les champs suivants : numro, titulaire et montant
reprsentant respectivement le numro du compte, le nom de son titulaire et le montant du
compte (en L.L de type double).
Un compte bancaire est soit un compte Courant, soit un compte Epargne. (On ne peut pas
crer une instance de la classe CompteBancaire)
Les champs numro et titulaire ne peuvent pas varier.
Les valeurs de numro et titulaire doivent tre dtermins la cration des comptes ;
(la valeur de montant est par dfaut gale 0). Les valeurs de numro sont des valeurs
entires successives et sont attribus automatiquement la cration des comptes. Les
comptes Courant ont un numro de 6 chiffres commenant 800001 et les comptes Epargne
ont un numro de 6 chiffres commenant 300001
Le champ montant doit tre dclar variable prive et par suite on doit dfinir les mthodes
getMontant et setMontant. La mthode setMontant sagit de faire un versement
sur un compte (ajouter une somme dargent au montant) ; Les versements sur un compte
Epargne sont facturs au taux de 1.5% (rduire de 1.5% la valeur de la somme dargent puis
lajouter au montant), les versements sur un compte Courant sont gratuits.
Lapplication doit tenir compte la contrainte suivante : le versement sur un compte doit
tre une valeur positive . Pour exprimer cette contrainte, dfinir une classe dexception
VersementNegatifException comme classe interne et gnrer une exception dans le cas dun
versement ngatif avec le message Exception, versement ngatif .
Lapplication doit avoir les mthodes ncessaires pour dcrire les caractristiques dun
compte sous la forme d'une chane de caractres ; par exemple, si C1 et la rfrence dun
compte Courant (numro = 800001, titulaire = Sami, montant = 1000,000) linstruction :
System.out.println (C1) doit afficher :
Le compte Courant, Numro 800001 de Sami a un montant de 1000,000 L.L.

a) Dfinir les trois classes : CompteBancaire, CompteCourant et CompteEpargne.


b) crire une classe Banque permettant de stocker des instances de comptes Courant et Epargne.
En interne, les comptes doivent tre stocks l'aide d'une java.util.HashSet. La classe
Banque possde les mthodes suivantes :
ajouter : qui permet d'ajouter un compte.
afficherTotal : permettant dafficher la somme des montants de tous les
comptes Epargne et la somme des montants de tous les comptes Courant.
supprimerComptes qui prend en paramtre un titulaire et supprime tous ses
comptes.
c) On veut ajouter la classe Banque une mthode sortCompteTitulaire()qui permet de
crer une ArrayList partir de la HashSet utilise dans cette classe, de trier cette ArrayList
suivant les valeurs de titulaire (ordre alphabtique) et pour chaque titulaire les comptes
seront tris suivant les valeurs de montant (en ordre dcroissant).
Ecrire le code correspondant la mthode sortCompteTitulaire(), le tri doit tre
effectu par un appel de la mthode Collections.sort(List) ; Ecrire le code ncessaire ajouter
lapplication (indiquer la classe concerne) afin davoir la possibilit dutiliser la mthode
Collections.sort(List).

Abdallah EL ASMAR

Page 69

Programmation Java : Patterns et bibliothques NFA035


Exercice 2: articles et stock darticles
Dans cet exercice on souhaite crire une application permettant de grer un stock possdant des
articles disponibles en plusieurs tailles.
Question 1 : Un article est caractris par son nom, son prix et par une liste de tailles disponibles
(String) ainsi que le nombre dexemplaires (int) disponible pour chaque taille. La liste de tailles
sera reprsente par un HashMap<String,Integer>.
Nous ne ferons pas de distinction entre majuscule et minuscules lors de la recherche dune taille.
Par exemple, si une de tailles enregistres est XXL, nous voudrons pouvoir trouver cette taille
partir de la chane xxL. Comment assurer ce comportement? Les variables dinstance seront
dclares prives, et votre classe doit possder un constructeur pour les initialiser. Votre classe doit
implanter les mthodes suivantes:
1. Deux accesseurs pour obtenir le prix de larticle, pour obtenir son nom;
2. afficher la liste de tailles disponibles;
3. ajouter une nouvelle taille;
4. ajouter une quantit dexemplaires pour une taille,
5. soustraire une quantit dexemplaires pour une taille (choue si pas assez de disponibilit);
6. renvoyer le nombre dexemplaires pour une taille donn ;
7. afficher toutes les dtails de larticle: nom, prix, tailles et nombre dexemplaires par taille;
8. affiche le nombre total dexemplaires (toutes tailles)
Question 2 : Dans cette question vous crirez une classe StockArticles qui possde un nom et une
liste darticles rangs dans une table dassociations entre noms darticles et articles. Nous ne ferons
pas de distinction entre majuscules et minuscules lors de la recherche dun nom darticle et en
particulier, il faudra assurer que deux articles diffrents ne possdent pas les noms veste et
Veste. Par ailleurs, larticle de nom veste pourra tre trouv partir de la chane VeSTe.
Comment assurer cette proprit? Comme dhabitude les variables seront dclares prives, vous
ajouterez un constructeur et des accesseurs. De plus, votre classe devra dfinir des mthodes
permettant de raliser les actions suivantes:
1. crer un nouvel article partir dun nom, un prix et un tableau de tailles;
2. afficher un article dun nom donn;
3. ajouter une quantit dexemplaires pour un nom darticle et une taille (renvoie false si article
inexistant);
4. calculer la taille du stock en nombre dexemplaires;
5. calculer la valeur du stock (somme de prix pour tous les exemplaires);
Question 3 : Ajoutez une mthode permettant dafficher la totalit des articles du stock tri par
ordre croissant de leurs prix. Pour cela vous utiliserez un Comparator.
Question 4 : On souhaite liminer du stock les articles dont plus aucune taille est disponible, et
vendre une solderie, tous les articles dont il reste moins quune quantit passe en paramtre.
Dans ce dernier cas, on veut sortir larticle du stock pour le mettre dans une nouvelle liste destine
la vente pour solderie. Ajoutez les mthodes ncessaires.
Question 5 : On souhaite disposer dune mthode qui prend un tableau de mot-cl, et qui affiche
tous les articles du stock qui contiennent en tant sous-chane dans leur noms un de ces mots. Par
exemple si les mots du tableau sont veste, pantalon, bleu, on pourra afficher les articles
chapeau bleu, veste bleu et pantalon rouge. Attention, si un nom darticle contient plusieurs
mots, il ne devra apparaitre quune seule fois dans les affichages.
Question 6 : Ecrivez un petit programme main qui dfinit et initialise un stock et teste toutes les
mthodes proposes.
Exercice 3
Limplmentation de la classe HashSet utilise la mthode hashSet() afin de dterminer si un objet est
dj dans la collection ou non. Nous voulons crire une classe qui ralise ce test en utilisant plutt la

Abdallah EL ASMAR

Page 70

Programmation Java : Patterns et bibliothques NFA035


mthode equals(Object o) pour dterminer lgalit entre objets. Cette classe utilise un ArrayList pour
simuler le comportement de la classe HashSet. Pour ce faire, on vous donne la classe suivante :
public class MySet<E> {
protected List<E> ls = new ArrayList<E>();
public boolean add(E v){
}
public Iterator<E> iterator() {

}
}
Question :
Complter les deux mthodes de la classe MySet et modifier (et/ou ajouter) ce qui est necessaire afin
de sassurer que :
la mthode add(E v) ne permet pas dajouter un objet dupliqu
la mthode iterator() doit retourner un objet itrateur instance dune classe interne
implmentant linterface Iterator (sans la mthode remove()) (il est interdit dutiliser la
mthode iterator() de la classe ArrayList).
Exercice 4
On voudrait implmenter une application de vente de fruits. On considre uniquement 2 fruits Orange
et Banane : La classe Orange contenant 3 champs type, price et country reprsentant
respectivement le type (par exemple Mandarine), le prix (en L.L. de type double) et le pays d'origine
de l'orange (chane de caractres). La classe Banane contient 2 champs type et country
reprsentant le type et le pays d'origine de la banane.
Chacune de ces deux classes, doit avoir un constructeur et les mthodes getCountry(), getType(),
getPrice() et toString() :
La mthode getPrice() de Banane retourne toujours la valeur 1500.0 ; la mthode toString() retourne
une chane reprsentant le fruit, par exemple :
Pour une orange de type = Mandarine, prix = 1000 et pays = Liban, la mthode doit retourner :
{Orange : Mandarine de Liban, 1000 L.L.}
a) Ecrire linterface Fruit comme interface des classes Orange et Banane.
b) Ecrire la classe Orange qui implmente linterface Fruit, et qui rpond aux spcifications dcrites
ci-dessus ; en plus, ajouter la contrainte suivante : il nest pas possible de crer des oranges
avec un prix ngatif . Pour exprimer cette contrainte, dfinir une classe dexception
PrixNegatifException comme classe interne de la classe Orange et gnrer une instance de cette
exception dans le cas dun prix ngatif avec le message Exception, prix ngatif .
Les variables de la classe Orange doivent tre dclares variables prives.
c) Montrez dans une mthode main comment peut-on crer une instance de la classe Orange.
d) crire une classe Basket permettant de stocker des instances de Fruit (Orange et Banane). En
interne, ces fruits seront stocks l'aide d'une java.util.ArrayList. La classe Basket
possde les mthodes suivantes :
add qui permet d'ajouter un fruit dans le basket,
getPrice permettant de retourner la valeur d'un basket (Somme des prix des fruits du
basket),
deleteItemsByCountry qui prend en paramtre un pays et retire du basket tous
les fruits de ce pays,
findFirstItemByCountry qui prend en paramtre un pays et retourne le
premier Fruit de ce pays. Que doit-on faire sil n'y a pas de Fruit de ce pays ?
e) On veut ajouter la classe Basket deux mthodes sortCountryType() et sortTypePrice() :
sortCountryType() permet de trier lArrayList de Basket suivant les valeurs de country
et pour chaque country les fruits seront tris suivant les valeurs de type; sortTypePrice() permet
de trier lArrayList suivant les valeurs de type et de prix. Ecrire seulement le code correspondant
la mthode sortCountryType(),(utiliser la mthode Collections.sort(List, Comparator) )

Abdallah EL ASMAR

Page 71

Programmation Java : Patterns et bibliothques NFA035


Srie - Swing
Exercice 1
Il s'agit d'crire en Java une application simple permettant de calculer les
mensualits dun prt partir de la valeur du prt, du nombre dannes et du
taux dintrt. La figure ci-dessous prsente l'interface graphique de la
fentre principale de cette application.
Lutilisateur crit, dans le premier champ de texte, un nombre (la valeur du
prt), dans le deuxime champ le nombre dannes, puis appuie sur le
bouton, alors la mensualit est affiche dans le troisime champ de texte.
Pour ce faire, vous devez complter la classe MainFrame suivante :
public class MainFrame extends JFrame{
private double vInteret = 0.0525 ;
JTextField prt,annee, mens ;
JButton calculer ;
JLabel interet ;

public MainFrame(){

}
private int calculerMensualite(int valeurPret, int nbAnnee){
double interetTotal = vInteret*nbAnnee;
double total=(interetTotal+1)*valeurPret;
int mensualite=Math.round(total/(12*nbAnnee));
return mensualite;
} }

a) crire le code Java permettant davoir linterface suivante avec le fonctionnement dcrit cidessus.
b) Nous voulons que cette application ne fonctionne pas (la mensualit ne saffiche pas) lorsque
la mensualit calcule est plus petite que 100. Pour ce faire, vous devez crire un code
permettant de lever une exception dans la mthode calculerMensualite.
c) On suppose maintenant que le taux dintrt est stock dans un fichier taux.txt en tant quune
valeur double. Nous voulons que lapplication au dmarrage initialise lattribut vInteret
partir de la valeur stocke dans ce fichier comme suit :
public MainFrame(){

vInteret = initialiseInteret() ;

}
private double initialiseInteret(){

}
Complter la mthode initialiseInteret qui devra ouvrir le fichier "taux.txt" en lecture,

lire la premire ligne et extraire la valeur de lintrt, fermer le fichier et retourner cette valeur.
Vous devez utiliser les flux FileReader et BufferedReader.
Exercice 2
La figure ci-dessous prsente linterface pour une application de discussion instantane (chat).
Trois utilisateurs Lui, Toi et Moi discutent : lutilisateur saisit un message dans la partie infrieure
de sa fentre (dans le JTextField ) et clique sur le bouton OK pour lenvoyer tous les utilisateurs
connects. Quand lutilisateur clique sur le bouton OK, le message saisi dans le JTextField est

Abdallah EL ASMAR

Page 72

Programmation Java : Patterns et bibliothques NFA035


ajout au contenu de JTextArea dans la partie suprieure de toutes les fentres des utilisateurs et le
JTextField est initialis.

a) Complter la classe ChatSwing (listing ci-dessous) qui correspond laspect graphique de la


figure ci-dessus. (il faut avoir exactement le mme aspect graphique) (3 pts)
import javax.swing.*;
import java.awt.*;
public class ChatSwing extends JFrame {
private JTextArea messages = new JTextArea(12, 20);
private JLabel nom = new JLabel();
private JTextField texte = new JTextField(15);
private JButton bOK = new JButton("OK");
private JPanel p1 = new JPanel();
private JPanel p2 = new JPanel();
public ChatSwing(String pseudo) {
super("Chat de " + pseudo);
nom.setText(pseudo);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
Container c = this.getContentPane();
this.pack();
this.setVisible(true);
}
}

b) Pour rendre actif le bouton OK, on va appliquer le patron MVC, le modle pour cette
application est dfinie par la classe suivante :
public class Modele {
private String message;
public String getMessage(){ return message;
public void setMessage(String message){
this.message = message;
}
}

Ecrire toutes les instructions ncessaires modifier ou ajouter aux classes Modele et ChatSwing
afin dappliquer le MVC et de rendre actif cette application. Prciser exactement lendroit o on doit
ajouter ou modifier une instruction.
Abdallah EL ASMAR

Page 73