Академический Документы
Профессиональный Документы
Культура Документы
Abdallah EL Asmar
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
Abdallah EL ASMAR
Page 2
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
Abdallah EL ASMAR
Page 4
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
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
Abdallah EL ASMAR
Page 7
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
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
Abdallah EL ASMAR
Page 10
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
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
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
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
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
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.
Abdallah EL ASMAR
Page 16
<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
}
Abdallah EL ASMAR
Page 17
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
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
Abdallah EL ASMAR
Page 20
}
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
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
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.
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
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 :
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
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
25
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
spcifi.
void <T> copy(List<? super T> dest, List<? extends T> src) :
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):
<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll):
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;
}
}
27
"Deux",
"Trois") ;
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.
28
29
Programmation vnementielle
Graphical user interfaces (GUI)
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.
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
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
32
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
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)
gnrs by
JButton, JTexField
JMenuItem,
ActionListener
JCheckbox,
JCheckboxMenuItem,
ItemListener
JFrame, JPanel,
JWindow, JDialog,
MouseListener
public
public
public
public
public
JFrame, JPanel,
JWindow, JDialog,
MouseMotionListener
JTextField
TextListener
35
void
void
void
void
void
mouseClicked(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
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
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
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
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);
}
}
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
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);
}
}
42
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
44
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
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).
46
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
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
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
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
51
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
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
54
Sujet
Observer
ajouterOb
supprimerOb
notifierObs
miseAjour
ObserverConcret
SujetConcret
miseAjour
55
56
public Observable()
Construit un objet observable avec initialement 0 observateurs
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
}
sujC.setValue(4);
obA.afficher();
obB.afficher();
}
}
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
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
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
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
64
}
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
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
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
Abdallah EL ASMAR
Page 67
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
Abdallah EL ASMAR
Page 69
Abdallah EL ASMAR
Page 70
}
}
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
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
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