Java V 1 3
Java V 1 3
1. Présentation du Langage..................................................................................................................... 3
1. Bref historique ................................................................................................................. 3
2. Les caractéristiques du langage Java ........................................................................... 3
3. Kit de développement ...................................................................................................... 6
2. Structure du Langage ........................................................................................................................... 9
1. La syntaxe ....................................................................................................................... 9
2. Classes et Objets............................................................................................................ 12
3. Méthodes et variables de la classe ............................................................................. 15
4. Les packages................................................................................................................. 16
5. Classes particulières ...................................................................................................... 16
3. L’héritage en Java ................................................................................................................................ 21
1. Principe de L’héritage ................................................................................................. 21
2. Syntaxe de l’héritage ................................................................................................... 21
3. Polymorphisme ............................................................................................................ 23
4. Classes et méthodes abstraites ................................................................................... 24
5. Les interfaces ................................................................................................................. 24
4. Les Collections...................................................................................................................................... 25
1. Définitions ..................................................................................................................... 25
2. L’interface Collection ................................................................................................... 26
3. La classe ArrayList ........................................................................................................ 27
4. L’interface Map ............................................................................................................. 28
5. Tri et Recherche dans des collections ........................................................................... 29
6. La gestion du temps (Date/Time) .................................................................................. 30
5. Les entrées sorties .............................................................................................................................. 31
1. Les flux java .................................................................................................................. 31
2. La classe File................................................................................................................. 31
3. Les flux octets ............................................................................................................... 32
4. Les flux caractères ......................................................................................................... 34
5. Les filtres ....................................................................................................................... 35
6. Sérialisation des objets .................................................................................................. 35
6. Le graphique en Java.......................................................................................................................... 37
1. Graphique en Java ......................................................................................................... 37
2. Composants lourds/ légers ............................................................................................ 39
3. Composants de base .................................................................................................... 41
4. Mise en page des composants dans un conteneur ......................................................... 43
5. Traitement des événements ........................................................................................... 45
6. Les autres Composants graphiques ............................................................................... 48
7. Accès aux bases de données en JDBC .......................................................................................... 55
1. Principe.......................................................................................................................... 55
2. Mise en œuvre ............................................................................................................... 55
3. PreparedStatement et CollablStatement .......................................................................... 57
4. Les métadonnées ........................................................................................................... 58
8. Client / Serveur en RMI .................................................................................................................... 60
1. Définition ...................................................................................................................... 60
2. Mise en œuvre ............................................................................................................... 60
© M. Lahmer 2002-2017 2
1. Présentation du Langage
1. Bref historique
1993 : projet Oak (langage pour l'électronique grand public)
1995 : Java / HotJava
Mai 95 : Netscape prend la licence
Sept. 95 : JDK 1.0 b1
Déc. 95 : Microsoft se dit intéresser
Janv. 96 : JDK 1.0.1
Eté 96 : Java Study Group ISO/IEC JTC 1/SC22
Fin 96 : RMI, JDBC, JavaBeans, ...
Fév. 97 : JDK 1.1
98 : C’est la grande révolution JDK 1.2 ou java 2
Java 2
Spécification
J2ME J2SE J2EE
(Java 2 Micro Edition) (Java 2 Standard Editon) (Java 2 Enterprise Edition)
Tout est classe (pas de fonctions { l’extérieure d’une classe) sauf les types primitifs (int,
float, double, ...) et les tableaux
Toutes les classes dérivent de [Link]
Héritage simple pour les classes
Héritage multiple pour les interfaces
© M. Lahmer 2002-2017 3
Les objets se manipulent via des références
Une API objet standard est fournie
La syntaxe est proche de celle de C
Un langage compilé est un langage qui permet de créer un fichier exécutable { partir d’un
programme source
Un langage interprété est un langage ou le code source doit être lu par un interpréteur
pour s’exécuter.
Le code source est d’abords compilé en byte code (attention ce n’est pas un code
machine) puis interprété et exécuté par la machine virtuelle Java (JVM)
Les programmes java (à part certains cas très particuliers) sont indépendants de la
plate-forme.
Il est d’abord traduit dans un langage appelé « bytecode » qui est le langage d’une
machine virtuelle (JVM ; Java Virtual Machine) dont les spécifications ont été définies par
Sun.
La Java Virtual Machine (JVM) est présente sur Unix, Linux,Win32, Mac, OS/2, Mozilla,
Netscape, IE, ...
La taille des types primitifs est indépendante de la plate-forme contrairement à C ou C++.
Java supporte un code source écrit en Unicode facilement internationalisable.
© M. Lahmer 2002-2017 4
4. Java est robuste
Gestion de la mémoire par un garbage collector qui Libère la mémoire d’un objet non
utilisé. Évite la surcharge
Mécanisme d'exception des erreurs système pris en charge par la JVM. (Accès à une
référence null exception)
Compilateur contraignant (erreur si exception non gérée, si utilisation d’une variable
non affectée, ...).
Tableaux = objets (taille connue, débordement : exception)
Contrôle des cast à l'exécution. Seules les conversions sûres sont automatiques.
La sécurité est indispensable avec le code mobile (Applications répartis). Il existe trois niveaux
de sécurité au niveau de la JVM:
Vérification : vérifie le byte code.
Chargement (Class Loader) : responsable du chargement des classes. (vérifier les
autorisations private, protected, public)
Contrôle (Security Manager) : contrôle l’accès aux ressources. En plus vous avez la
possibilité de certifier le code par une clé. (mécanismes de cryptographie et
d’authenticité)
Une fois le code est chargé en mémoire, il est impossible de faire un accès direct à la mémoire
contrairement à C et C++.
© M. Lahmer 2002-2017 5
3. Kit de développement
1. JVM / JRE
Les machines virtuelles java sont fournies gratuitement par Sun Microsystems. Elles sont
fournies sous forme de JRE (Java Runtime Environment) comprenant la machine virtuelle et les
package du noyau de java (APIs).
Le JRE ne contient pas d'outils ou d'utilitaires pour compiler ou débuguer les applets ou les
applications.
Intel, Motorala, Ultra-sparc sont des exemples de processeurs intégrés dans des plate-formes
type : Pc, Mac ou Station Sun
2. Structure JSDK
JSDK (Java Software Developpement Kit) est composé de JRE et plusieurs outils.
© M. Lahmer 2002-2017 6
Les outils
javac : compilateur de sources java
java : interpréteur de byte code
appletviewer : interpréteur d'applet
javadoc : générateur de documentation (HTML, MIF)
javah : générateur de header pour l'appel de méthodes natives
javap : désassembleur de byte code
jdb : débegueur
javakey : générateur de clés pour la signature de code
rmic : compilateur de stubs RMI
rmiregistry : "Object Request Broker" RMI
© M. Lahmer 2002-2017 7
[Link] : signature, cryptographie, authentification
[Link] : sérialisation d'objets
[Link] : Remote Method Invocation
[Link] : extension du [Link], plus riches en terme de composants
Java2D : intégré depuis JDK 1.2 sous forme de sous paquetage du awt.
[Link] et [Link] : contient une implémentation de la plupart des
standard de la cryptographie et le hashage.
[Link] : pour le traitement des fichiers xml
Il existe d’autres Apis tierces que vous pouvez télécharger indépendamment du Kit :
JFreeChart / JGraph : pour la génération des graphes tels que les histogrammes, les secteurs,….
SNMP4J : La supervision d’un réseau par le biais du protocole snmp
Jpcap : La capture des trames, paquets qui circules dans un réseau
[Link] : offre un support à la majorité des protocoles réseaux
(FTP/FTPS, NNTP, SMTP(S), POP3(S), IMAP(S), Telnet, TFTP, …)
© M. Lahmer 2002-2017 8
2. Structure du Langage
1. La syntaxe
La classe Helloworld est public, donc le fichier qui la contient doit s’appeler (en tenant
compte des majuscules et minuscules) [Link]
Un fichier .java peut contenir la définition de plusieurs classes mais une et une seule qui doit
être publique
Compilation avec javac c:\>javac [Link]
o crée un fichier « [Link] » qui contient le bytecode, situé dans le même
répertoire que le fichier « .java »
Execution avec java c:\>java HelloWorld
o interprète le bytecode de la méthode main() de la classe HelloWorld
[Link] doit être dans le répertoire courant ou dans un des emplacements
indiqués par une option -classpath ou par la variable CLASSPATH
Un identificateur Java
– est de longueur quelconque
–commence par une lettre Unicode (caractères ASCII recommandés)
– peut ensuite contenir des lettres ou des chiffres ou le caractère souligner _
– ne doit pas être un mot-clé ou les constantes true, false et null
Les commentaires
Sur une seule ligne int prime = 1500; // prime fin de mois
Sur plusieurs lignes : /* Première ligne du commentaire
Suite du commentaire */
© M. Lahmer 2002-2017 9
3. Les types primitifs
boolean(true/false), byte (1 octet), char (2 octets), short (2 octets), int (4 octets), long
(8 octets), float (4 octets), double (8 octets).
Les caractères sont codés par le codage Unicode (et pas ASCII) ’\u03a9’
Les variables peuvent être déclarées n'importe où dans un bloc.
Les affectations non implicites doivent être castées (sinon erreur à la compilation).
int i = 258;
long l = i;
Valeurs par défaut
Si elles ne sont pas initialisées, les variables d’instance ou de classe (pas les variables
locales d’une méthode) reçoivent par défaut les valeurs suivantes :
boolean false
char ’\u0000’
Entier (byte short int long) 0 0L
Flottant (float double) 0.0F 0.0D
Référence d’objet null
Les constantes
Une constante « entière » est de type long si elle est suffixée par « L » et de type
int sinon
Une constante « flottante » est de type float si elle est suffixée par « F » et de type
double sinon : .123587E-25F // de type float
4. La conversion de type
© M. Lahmer 2002-2017 10
5. Les structures de contrôle
6. Les tableaux
En Java un tableau est traité comme un objet, donc il faut le déclarer et l’initialiser avant de
l’utiliser
Déclaration
int[ ] tab_of_int; // équivalent à : int tab_of_int[ ];
Color rgb_cube[ ][ ][ ];
Création et initialisation
array_of_int = new int[42];
rgb_cube = new Color[256][256][256];
int[ ] primes = {1, 2, 3, 5, 7, 7+4};
tab_of_int[0] = 3 ;
Utilisation
int l = tab_of_int.length; // l = 42
L’indice commence à 0 et se termine à length - 1
int e = tab_of_int[50]; /* Lève une Exception ArrayIndexOutOfBoundsException*/
Exemple de programme qui affiche les éléments d’un tableau
public class AfficherTab {
public static void main(String[] args)
{
int [ ] T={10, 2, 15, -8, 7};
for (int el:T)
© M. Lahmer 2002-2017 11
{
[Link](el);
}
}
}
2. Classes et Objets
1. Objet / Classe
Un objet peut être envisagé de façon pragmatique comme constitué de deux parties :
Une partie de stockage physique (Objet)
Une partie descriptive (Classe)
L'Objet peut être apparenté à une variable de type structure en C (record en pascal, ligne
d'une table dans une BD Relationnelle)
Une classe n'est pas destinée au stockage des données. C'est un type de données abstrait,
caractérisé par des propriétés (attributs et méthodes) communes à des objets et permettant
de créer des objets possédant ces propriétés.
© M. Lahmer 2002-2017 12
Nom_Classe Point
Attributs float x
float y
2. Les constructeurs
Fichier [Link]
/** Pour tester la classe Point */
class TestPoint {
public static void main(String[] args) {
Point p1 = new Point(1, 2);
Point p2 = new Point(5, 1);
[Link]("Distance : " + [Link](p2));
}}
Le mot clé new permet d’allouer de l’espace mémoire au nouvel objet de type Point.
3. Les méthodes
Une méthode est l’équivalent d’une fonction en C. Quand la méthode renvoie une valeur, on doit
indiquer le type de la valeur renvoyée dans la déclaration de la méthode double
© M. Lahmer 2002-2017 13
calculSalaire(int indice, double prime). Le pseudo-type void indique qu’aucune valeur n’est
renvoyée void setSalaire(double unSalaire)
Le mode de passage des paramètres dans les méthodes dépend de la nature des paramètres :
par référence pour les objets
par copie pour les types primitifs
public class C {
void methode1(int i, StringBuffer s)
{ i++; [Link]("d");}
void methode2() {
int i = 0;
StringBuffer s = new StringBuffer("abc");
methode1(i, s);
[Link](i=" + i + ", s=" + s); // i=0, s=abcd }}
Du moment que I est de type primitif il est passé { méthode1 par copie et donc sa valeur n’a pas
changée. Mais s est un Objet donc il prend la dernière valeur attribuée dans methode1 parce
qu’il est transféré par référence.
© M. Lahmer 2002-2017 14
3. Méthodes et variables de la classe
1. Variables de classe
Certaines variables peuvent être partagées par toutes les instances d’une classe. Ce sont les
variables de classe (modificateur static en Java). Si une variable de classe est initialisée dans sa
déclaration, cette initialisation est exécutée une seule fois quand la classe est chargée en
mémoire
Les variables static sont communes à toutes les instances de la classe.
public class Employe {
private static int nbEmployes = 0;
// Constructeur
public Employe(String n, String p) {
nom = n;prenom = p;nbEmployes++;}}
2. Méthodes de classe
Une méthode de classe (modificateur static en Java) exécute une action indépendante d’une
instance particulière de la classe. Elle ne peut utiliser de référence à une instance courante (this)
static double tripleSalaire() {return salaire * 3;} // NON
La méthode main() est nécessairement static. Pourquoi ?
Pour désigner une méthode static depuis une autre classe, on la préfixe par le nom de la classe :
int n = [Link]();
On peut aussi la préfixer par une instance quelconque de la classe (à éviter car cela nuit à la
lisibilité : on ne voit pas que la méthode est static) : int n = [Link]();
Le modificateur final indique que la valeur de la variable (d'état ou locale) ne peut être modifiée.
On pourra lui donner une valeur une seule fois dans le programme (à la déclaration ou ensuite).
Une variable de classe static final est vraiment constante dans tout le programme ;
© M. Lahmer 2002-2017 15
static final double PI = 3.14;
Une variable d’instance (pas static) final est constante pour chaque instance ; mais elle peut
avoir 2 valeurs différentes pour 2 instances. Elle peut ne pas être initialisée à sa déclaration mais
elle doit avoir une valeur à la sortie de tous les constructeurs
4. Les packages
Un package regroupe un ensemble de classes sous un même espace de 'nomage'. Les noms des
packages suivent le schéma : [Link] ...
Une classe employe appartenant au package [Link] doit se trouver dans le fichier
societe\travail\. L'instruction package indique à quel package appartient la ou les classe(s) de
l'unité de compilation (le fichier). En dehors du package, les noms des classes sont :
[Link], sinon L'instruction import packageName permet d'utiliser des
classes sans les préfixer par leur nom de package.
Encapsulation (public, protected et private)
class c1 {
public int A; Package P2
PackageP1
protected int B;
int C;
class c4 extends c1 {
private int D;}
...
}
A B C D
Accessible par c2 o o o -
Accessible par c3 o o o -
Accessible par c4 o o - -
Accessible par c5 o - - -
5. Classes particulières
© M. Lahmer 2002-2017 16
chaine = "Bonjour";
La spécification de Java impose que
chaine1 = "Bonjour";
chaine2 = "Bonjour";
crée un seul objet String (référencé par les 2 variables)
La Concaténation
La concaténation se fait par l’opérateur + :
String s = "Bonjour" + " les amis";
int x = 5;
s = "Valeur de x + 1 = " + x + 1;
Les types primitifs lorsqu’ils sont concaténés avec un message sont convertis en String, ainsi s
contient Valeur de x + 1 = 51
Attention, la concaténation de Strings est une opération coûteuse (elle implique en particulier la
création d'un StringBuffer). Il faut passer explicitement par un StringBuffer si la concaténation
doit se renouveler. Une seule création d'un StringBuffer pour toutes les concaténations
char[] t={‘a’,’b’,’r’,’c’,’e’,’f’};
c = new StringBuffer(t[0]);
for (int i = 1; i < [Link]; i++) [Link](t[i]);
Fonctions de comparaison
La méthode equals() teste si 2 instances de String contiennent la même valeur elle retourne
true ou false:
String s1, s2;
s1 = "Bonjour ";s2 = "les amis";
if ((s1 + s2).equals("Bonjour les amis"))
[Link]("Egales");
equalsIgnoreCase() pas de différence entre majuscule et minuscule
[Link](t) renvoie ( « signe » de s-t)
0 en cas d’égalité de s et de t,
un nombre entier positif si s suit t dans l’ordre lexicographique
un nombre entier négatif sinon
compareToIgnoreCase(t)
D’autres fonctions
Fonction Rôle
int length() Retourne la longueur de la chaîne appelante
String toString() Convertir un objet en String
char charAt(int i) Retourne le caractère à la position i (0<= i < length())
© M. Lahmer 2002-2017 17
String substring (int d, int f) Retourne tous les caractères entre la position d et f dans
une chaîne.
int indexOf(String sCh) Retourne la position de la sous chaîne sCh s’elle existe. -
1 si non
int indexOf(String sCh, Cherche la position de sCh à partir de debut. elle
int debut) retourne sa position s’elle existe et – 1 si non
String [ ] split(String sep) Permet de décomposer une chaîne en un tableau de
String en utilisant le séparateur sep
Exercice
Ecrire un programme Java qui permet de récupérer le protocole, la machine, le
répertoire et le nom du fichier une adresse Web
[Link]
Le paquetage [Link] fournit des classes pour envelopper les types primitifs (les objets sont
constants) : Byte, Short, Integer,Long, Float, Double, Boolean,Character.
Les classes enveloppes offre des méthodes utilitaires (le plus souvent static) pour faire des
conversions entre types primitifs (et avec la classe String)
Fonction Classe Rôle
int intValue() Integer Retourne l’entier encapsulé dans
l’objet de type Integer
static int parseInt(String ch) Convertis une chaîne de caractère ch en
un entier
static String toBinaryString(int i) Integer Convertis un entier en String
représentant la représentation binaire
de i.
static String toHexString(int i) Integer Convertir un entier en String
représentant la représentation Hexa
Décimal de i.
static String valueOf(int i) String Convertis un entier en String.
© M. Lahmer 2002-2017 18
3. La classe System
Cette classe est très utile pour diverses opérations d'entrée et sortie, d'émission d'erreurs,
d'accès aux propriétés du système, et bien d'autres fonctionnalités relatives à des tâches
système.
[Link](NomPropriete) : renvoie la valeur de la propriété system ci-
dessous quelques exemples de Récupération des variables d’environnement :
- Nom Utilisateur Connecté : [Link]("[Link]")
- Répertoire de travail : [Link]("[Link]")
- Nom OS installé : [Link]("[Link]")
- Version OS installé : [Link]("[Link]");
[Link](code retour) : arrêt immédiat de la JVM
[Link]() : appel explicite du Garbage Collector ou (Ramasse Miettes). Le ramasse-
miettes (garbage collector) est une tâche(job) qui travaille en arrière-plan et dont le rôle
de libérer la place occupée par les instances non référencées. Il intervient
automatiquement quand le système a besoin de mémoire ou, de temps en temps, avec
une priorité faible (voir Thread). Avant la suppression d’un objet par le ramasse miettes,
le système appelle la méthode finalize() de la classe de l’objet (si elle existe).
class garbage{
static boolean gcok=false;/*devient true lorsque le GC est
appelé*/
static int count;
public garbage(){count++;}
public void finalize(){
if(gcok==false)
[Link]("Appel GC:\n"+"Nombre d'instance
crees/supprimées : "+count);
gcok=true;}
public static void main(String[] args)
while(!gcok) {new garbage();}}}
© M. Lahmer 2002-2017 19
// Code qui sera exécuté dans tous les cas}
Noter bien que finally est optionnel. Il est utilisé lorsque vous voulez exécuter un bloc
d’instruction indépendamment du résultat de try/catch.
soit être situé dans une méthode propageant (throws) de cette classe d'exception void
fonction throws IOException { // . . . }
Plusieurs exceptions sont déjà définies dans [Link] comme par exemples :
- NullPointerException
- OutOfMemoryException
- ArithmeticException
- ClassCastException
- ArrayIndexOutOfBoundsException
La levée d'une exception provoque une remontée dans l'appel des méthodes jusqu'à ce qu'un
bloc catch acceptant cette exception soit trouvé. Si aucun bloc catch n'est trouvé, l'exception est
capturée par l'interpréteur et le programme s'arrête.
Object getContent()
{
try
{
openConnection(); void openConnection()
1 throws IOException
} {
catch(IOException e) openSocket();
{ sendRequest(); 4 2
5
... receiveResponse(); void sendRequest()
} } throws IOException
finaly { {
... 6 write(header);
} 3write(body);//ERROR
... }
}
7
Il est tout à fait possible de définir vos propres exceptions en créant une classe qui dérive de la
classe mère Exception.
public class MonException extends Exception
{ public MonException(String text)
{ super(text); }}
On utilise le mot clé throw pour lever une exception en instanciant un objet sur une classe
dérivée de la classe Exception : throw new MonException("blabla");
© M. Lahmer 2002-2017 20
3. L’héritage en Java
1. Principe de L’héritage
Le concept d'héritage est un des concepts les plus importants de l’orienté objet. C’est grâce { ce
dernier que la programmation objet est ce qui est aujourd’hui. Par définition l’héritage est le fait
de pouvoir utilisé tout ce qui a déjà été fait (réutilisation) et de pouvoir l'enrichir
(spécialisation). Il indique toujours une relation de type "est un" ou « est une sorte de » :
- Un lapin est un animal,
- Un employé est une personne,
- Un pc est une machine.
En Java, chaque classe a une et une seule classe mère (pas d’héritage multiple) dont elle hérite
les variables et les méthodes. Le mot clef extends indique la classe mère par exemple : class B
extends A{ }. La classe A s'appelle une classe mère, ou super-classe et la classe B qui hérite de la
classe A s'appelle une classe fille ou sous-classe.
Dans B on indique seulement ce qui a changé dans B par rapport au code de A ; on peut :
ajouter des variables, des méthodes et des constructeurs
redéfinir des méthodes (exactement la même signature et le même type retour)
surcharger des méthodes (même nom mais pas même signature) (possible aussi à
l’intérieur d’une classe)
Note : Si « B extends A », le grand principe est que tout B est un A (A b=new B() )
2. Syntaxe de l’héritage
1. Constructeur
La règle générale est que pour construire un objet de la sous-classe il faut d’abord construire un
objet de la super-classe. Si un constructeur de la classe dérivée appelle explicitement un
constructeur de la classe de base, cet appel doit être obligatoirement la première instruction de
constructeur. Il doit utiliser pour cela, le mot clé super.
Si une classe B hérite de A (B extends A), elle hérite automatiquement et implicitement de tous
les membres de la classe A (mais pas les constructeurs et les membres private)
© M. Lahmer 2002-2017 21
3. Redéfinition
Supposons que B hérite de A et que la méthode m() de A soit redéfinie dans B selon le schéma
UML suivant :
B
A
String s
void m()
void m()
void p()
Un objet d'une classe dérivée peut toujours être utilisé au lieu d'un objet de sa super-classe donc
on peut écrire par exemple :
A a = new B();
a.m();
Quelle méthode m() sera exécutée celle de A ou celle de B ?. Éventuellement celle de B parce
que le contenu de a est un objet de B.
4. Conversion
Un objet de type B est un A. Mais l’inverse n’est pas vrai. Une machine n’est pas nécessairement
un pc.
A a ; B b = new B(’’s’’);
Cas a=b; // vrai
L’écriture a.m(); est vrai parce que m() est définie dans A. Mais a ne peut pas appeler p() donc
a.p() est fausse.
Cas b=a; // fausse
Dans ce cas un cast est nécessaire parce que a ne contient pas tous les éléments de b (dans ce cas
le champs s)
Cas b=(B) a ;// vrai lors de la compilation mais pas à l’exécution
Une classe utilise le mot clef final dans sa définition ne peut avoir de classes filles (String et
[Link] sont final)
Une Méthode final : ne peut être redéfinie
Un Paramètre final (d’une méthode) : la valeur (éventuellement une référence) ne
pourra être modifiée dans le code de la méthode
Une Variable (locale ou d’état) final : la valeur ne pourra être modifiée après son
initialisation
© M. Lahmer 2002-2017 22
3. Polymorphisme
Une méthode est dite polymorphe si elle a le même nom dans plusieurs classes dérivées
mais pas la même implémentation.
Figure
void dessiner()
Cercle Rectangle
La façon de dessiner un cercle est différente de celle qu’on utilise pour dessiner un rectangle
donc la méthode dessiner() est polymorphe.
Il faut savoir que les opérations comportant des ifs sont coûteuses au niveau processeur.
- faciliter l’extension des programmes : on peut créer de nouvelles sous classes
sans toucher aux programmes déjà écrits. Par exemple, si on ajoute une classe Losange, le code
de afficher() sera toujours valable.
© M. Lahmer 2002-2017 23
4. Classes et méthodes abstraites
Une méthode est dite abstraite (modificateur abstract) si on la déclare, sans donner son
implémentation : public void payer() ;
Une classe doit être déclarée abstraite (abstract class) si elle contient au moins une
méthode abstraite. Mais il est possible de déclarer une classe abstraite sans aucune
méthode abstraite
Il est interdit de créer une instance d’une classe abstraite.
Une méthode static ne peut être abstraite (car on ne peut redéfinir une méthode static)
5. Les interfaces
Une interface est une « classe » purement abstraite dont toutes les méthodes sont abstraites et
publiques (les mots-clés abstract et public sont optionnels dans la déclaration des méthodes).
En fait, une interface correspond à un service rendu ou un comportement qui correspond aux
méthodes de l'interface
[public] interface NomDeLInterface [extends InterfaceMere] {}
Une interface ne peut contenir que :
des méthodes abstract et public
des définitions de constantes publiques (« public static final »)
Une interface ne peut contenir de méthodes static, final, synchronized ou native
Pour implémenter une interface, il faut rajouter à la déclaration de la classe concernée le mot
clé implements suivi du nom de l'interface. Une classe peut implémenter une ou plusieurs
interfaces (et hériter d'une classe)
Lorsqu’une classe C implémente une interface I elle doit redéfinir toutes les méthodes de I, sinon
il faut la déclarer abstraite.
© M. Lahmer 2002-2017 24
4. Les Collections
1. Définitions
Une collection est un objet qui contient d’autres objets par exemple, un tableau est une
collection. Le JDK fournit d’autres types de collections sous la forme de classes et d’interfaces
définies dans le paquetage [Link] et organisées selon 2 hiérarchies d’interfaces principales
Collection correspond aux interfaces des collections proprement dites
Map correspond aux collections indexées par des clés ; un élément d’une map est
retrouvé rapidement si on connaît sa clé.
© M. Lahmer 2002-2017 25
2. L’interface Collection
2. Les itérateurs
Un itérateur (instance d’une classe qui implémente l’interface Iterator) permet d’énumérer les
éléments contenus dans une collection. L’interface Collection fournit la méthode Iterator
iterator() qui renvoie un itérateur pour parcourir les éléments de la collection. Les principales
méthodes de Iterator sont :
boolean hasNext() : permet de vérifier s'il y a un élément qui suit
© M. Lahmer 2002-2017 26
Object next() : retourne l’élément en cours et pointe sur l'élément suivant
Iterator it=[Link]();
while ([Link]()) // tant qu’ il y a un element non parcouru
{
Object o = [Link]();
//les opérations
}
3. La classe ArrayList
Est une classe qui implémente l’interface List. Une instance de la classe ArrayList est une sorte
de tableau qui peut contenir un nombre quelconque d’instances de la classe Object. Les
emplacements sont repérés par des nombres entiers ou des indices (à partir de 0). Les
principales méthodes en plus de celle de Collection sont
Object get(int indice)
int indexOf(Object obj)
void add(int indice, Object element)
void set(int indice, Object obj)
Object remove(int index)
Le type retour de la méthode get() est Object ; on doit donc souvent caster les éléments que l’on
récupère dans un ArrayList si on veut les utilisés. Ce problème ne se pose plus dans JDK 1.5 et
supérieur si on adopte le principe de généricité ou de template :
1) sans template
ArrayList l = new ArrayList();// création d’une Liste l
[Link]("Ahmed"); // ajouter les objets ds l
[Link]("Mohamed");
[Link]("Mustapha");
[Link]("Taib");
[Link](l); // trier les objets de l
String Nom =(String)[Link](2) ; // on utilise le cast
2) avec template
© M. Lahmer 2002-2017 27
for(String nom :L) [Link](nom);
2) ListIterator
ListIterator est une interface qui hérite de Iterator, ainsi en plus des méthodes hasNext() et
next() elle dispose de deux autres méthodes supplémentaires hasPrevious() et previous() qui
permettent de parcourir la liste dans le sens inverse.
List list = = new ArrayList();
// ajouter les objets ds List
ListIterator iterator = [Link]([Link]());
while ([Link]()) {
Object element = [Link]();
// traitement d'un élément
}
4. L’interface Map
Une Map est un ensemble de couples objets (clé, valeur) où Deux clés ne peuvent être égales au
sens de equals(). Dans l’algorithmique classique c’est une table de hachage (hashTable).
Clé (code Module) Valeur(Module)
IF11 M11
IF12 M12
Une entrée de la table est représentée par l’interface Entry qui permet de manipuler les
éléments d'une paire comme suit :
public interface Entry {
Object getKey();
Object getValue();
Object setValue(Object value);
}
getKey() et getValue() retournent respectivement la clé et la valeur associée { l’entrée en
cours.
Il existe deux implémentations de l’interface Map { savoir :
HashMap, table de hachage ; garantit un accès en temps constant
TreeMap, arbre ordonné suivant les valeurs des clés avec accès en log(n)
La comparaison des objets d’une Map utilise l’ordre naturel (interface Comparable) ou une
instance de Comparator. Les principales méthodes d’une hashMap sont :
Object put(Object key, Object value)
Object get(Object key)
Object remove(Object key)
© M. Lahmer 2002-2017 28
Les clés : La méthode setKey() permet de convertir une hashMap en un Set ensemble de clés.
Map hm = new HashMap();
Employe e = new Employe("Halim");
[Link]("E125");
[Link]([Link], e);
/*crée et ajoute les autres employés dans la table de hachage*/
Employe e2 = (Employe)[Link]("E369");
Collection elements = [Link]();
Iterator it = [Link]();
//Afficher tous les employes
while ([Link]()) {
[Link](
((Employe)[Link]()).getNom());}
© M. Lahmer 2002-2017 29
[Link](employes);
b) Recherche
Pour rechercher la position d’un objet dans une liste on peut utiliser les méthodes suivantes :
int binarySearch(List l, Object obj)
int binarySearch(List l, Object obj, Comparator c)
La liste doit être triée en ordre croissant suivant l’ordre naturel (interface Comparable) ou
suivant le comparateur, pour la 2ème méthode.
Avant JDK 1.8, on avait quelques classes pour l’obtention et le formatage de la date répartie :
[Link] (Date/Time), [Link] (Calendrier) , [Link] et
[Link] (formatage de la date).
Date now = new Date();
[Link](now); // Date time Système
// Utilisation DateFormat
DateFormat formatter = [Link](); // Date and time
String dateStr = [Link](now);
[Link](dateStr);
formatter = [Link](); // time only
[Link]([Link](now));
// Utilisation SimpleDateFormat
SimpleDateFormat simpleFormatter = new SimpleDateFormat("E [Link] 'at'
hh:mm:ss a zzz");
[Link]([Link](now));
A partir de JDK 1.8, on a introduit l’api [Link] qui concrétise toutes les fonctionnalités de la
gestion du temps : [Link].*, [Link].*, [Link].*,
[Link].*
© M. Lahmer 2002-2017 30
5. Les entrées sorties
2. La classe File
Cette classe fournie une définition plateform-independent des fichiers et des répertoires : Un
objet de type File peut représenter un fichier ou un répertoire. Elle permet de réaliser les
opérations de base sur les fichiers tels que le listage d’un répertoire, la vérification de l’existence
d’un fichier, etc…. Une partie des méthodes de la File sont illustrées ci-dessous :
© M. Lahmer 2002-2017 31
la création de fichiers temporaires (createNewFile, createTempFile)
la gestion des attributs "caché" et "lecture seule" (isHidden, isReadOnly)
des méthodes qui renvoient des objets de type File au lieu de type String ( getParentFile,
getAbsoluteFile, getCanonicalFile, listFiles)
Les principaux constructeurs sont :
File(File rep, String nom)
File(String chemin)
File(String rep, String nom)
if ([Link]() ) {
[Link](" contenu du repertoire ");
File fichiers[] = [Link]();
for(int i = 0; i <[Link]; i++) {
if (fichiers[i].isDirectory())
[Link]("d-"+fichiers[i].getName());
else
[Link]("f-"+fichiers[i].getName());
}}}
© M. Lahmer 2002-2017 32
1. File(Input|Output)Stream
import [Link].*;
public class CopyBytes {
public static void main(String[] args) throws IOException {
File inputFile = new File("[Link]");
File outputFile = new File("[Link]");
FileInputStream in = new FileInputStream(inputFile);
FileOutputStream out = new FileOutputStream(outputFile);
int c;
while ((c = [Link]()) != -1)
[Link](c);
[Link](); [Link](); }}
© M. Lahmer 2002-2017 33
2. Data (Input|Output) Stream
Ce sont ces classes qui possèdent des écritures ou lectures de plus haut niveau que de simples
octets (des entiers, des flottants, ...).
DataInputStream ,
public final boolean readBoolean() throws IOException
public final char readChar() throws IOException
public final int readInt() throws IOException
…
DataOutputStream,
public final void writeBoolean(boolean) throws IOException,
public final void writeChar(int) throws IOException,
public final void writeInt(int) throws IOException
Si vous écrivez un entier avec writeInt() il faut le lire avec readInt(). Les chaînes de caractères
sont lues par la méthode readUTF(). Pour lire un fichier texte ligne par ligne on peut utiliser la
méthode readLine(). Cette dernière a été déprécier et donc vous pouvez la remplacer par la
méthode de BuffredReader comme suit :
File inputFile = new File("[Link]");
DataInputStream in = new DataInputStream(inputFile) ;
BufferedReader brin = new BufferedReader(in) ;
String L=[Link]();
© M. Lahmer 2002-2017 34
import [Link].*;
public class Copy {
public static void main(String[] args) throws IOException {
File inputFile = new File("[Link]");
File outputFile = new File("[Link]");
[Link]();
[Link]();
}}
5. Les filtres
Un filtre permet de sélectionner les fichiers qui vérifient certains critères. En Java un filtre est un
objet d'une classe qui implémente l'interface FilenameFilter. Cette classe doit donner une
définition de la méthode public boolean accept(File rep, Stringnom) et seuls les noms de fichiers
qui renvoie true par cette méthode seront affichés.
import [Link].*;
class Filtre implements FilenameFilter {
public boolean accept(File rep, String nom) {
if ([Link](".java")) return true;
return false;}
//dans une classe de test
String nomFics[ ] = (new File(rep)).list(new Filtre());}
© M. Lahmer 2002-2017 35
Pour indiquer que les objets d'une classe peuvent être persistants on indique que cette classe
implémente l'interface Serializable.
Public class A implements Serializable{
// attributes sérializables
//…}
Certaines classes sont par défaut sérializable (String et Date). Les flux Objets en java
(Object(Input|Output)Stream) permettent de lire et écrire des objets sérialisables.
// Ecriture
FileOutputStream fos = new FileOutputStream("tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
[Link]("Today");
[Link](new Date());
[Link]();
// Lecture
FileInputStream fis = new FileInputStream("tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
String today = (String)[Link]();
Date date = (Date)[Link]();
Par défaut, tous les champs d’un objets sont sérialisés (y compris private) Cela peut poser des
problèmes de sécurité. Alors il existe 3 solutions possibles:
Réécrire les méthodes writeObjet() et readObject()
Utiliser le mot clé transient permet d'indiquer qu'un champs ne doit pas être
sérialisé : private transient passwd;
© M. Lahmer 2002-2017 36
6. Le graphique en Java
1. Graphique en Java
1. Paquetages de base
Une interface graphique est formée d’une ou plusieurs fenêtres qui contiennent divers
composants graphiques (widgets) tels que
boutons
listes déroulantes
menus
champ texte, etc...
Les interfaces graphiques sont souvent appelés GUI d’après l’anglais Graphical User Interface.
L’utilisation d’interfaces graphiques impose une programmation « conduite par les événements
». On peut distinguer deux packges de base pour la réalisation des GUI en java : [Link]
(Abstract Window Toolkit, JDK 1.1) et [Link] (JDK 1.2) qui font partie de JFC (Java
Foundation Classes).
Techniquement Swing est construit au-dessus de AWT
même gestion des événements
les classes de Swing héritent des classes de AWT
© M. Lahmer 2002-2017 37
3. Les principaux composants swing
Tous les composants de AWT ont leur équivalent dans Swing en plus joli et avec plus de
fonctionnalités. Syntaxiquement un objet swing est un objet awt avec un J comme préfixe ainsi
une étiquette Label en awt devient un JLabel en swing. En plus Swing offre de nombreux
composants qui n’existent pas dans AWT. La figure ci-dessous illustre quelques exemples de ces
composants.
© M. Lahmer 2002-2017 38
4. Premier programme Swing
import [Link].*;
public class HelloWorldSwing {
//Déclaration d’une fenêtre et d’une étiquette.
JFrame frm;
JLabel lbl;
public void GUI() {
//Création et initiation de la fenêtre.
frm = new JFrame("HelloWorldSwing");
//création d’une étiquette "Hello World".
lbl = new JLabel("Hello World");
//être sure d’avoir une bonne décoration v1.4.
[Link](true);
//Fermer l’application dès qu’on clique sur le bouton fermer
[Link](JFrame.EXIT_ON_CLOSE);
//ajouter le label à la fenêtre
[Link](lbl);
//Ajuster la taille de la fenêtre à la taille de ses composants
[Link]();
//Afficher la fenêtre.
[Link](true); }
}
class Test{
public static void main(String[] args) {
( new HelloWorldSwing()). GUI(); }
}
1. Les conteneurs
Pour construire une interface graphique avec Swing, il faut créer un (ou plusieurs) container
lourd et placer { l’intérieur les composants légers qui forment l'interface graphique.
© M. Lahmer 2002-2017 39
Il y a 3 sortes de containers lourds (un autre, JWindow, est rarement utilisé) :
JFrame fenêtre pour les applications
JApplet pour les applets
JDialog pour les fenêtres de dialogue
Il existe d’autres types de conteneurs qu’on appel intermédiaire légers tels que JPanel,
JScrollPane, JSplitPane, JTabbedPane qui servent à regrouper des composants dans une zone
spécifique d’un conteneur lourds.
Les principales méthodes
Méthode Rôle
component add(Component comp) pour ajouter le composant spécifié à la fin du
conteneur
2. La fenêtre JFrame
© M. Lahmer 2002-2017 40
Taille d’une fenêtre
La méthode pack() donne à la fenêtre la taille nécessaire pour respecter les tailles préférées des
composants de la fenêtre. Sinon si vous voulez une taille ou un emplacement précis sur l'écran
(en pixels) vous pouvez vous servir des méthodes suivantes :
setLocation(int xhg, int yhg) (ou Point en paramètre)
setSize(int largeur, int hauteur) (ou Dimension en paramètre)
setBounds(int x, int y, int largeur, int hauteur) (ou Rectangle en paramètre)
La taille de l’écran ainsi que sa résolution en cours peuvent être obtenues en utilisant la classe
abstraite [Link] implémenté dans AWT. Quelques méthodes publiques de cette classe
sont :getScreenSize, getScreenResolution, getDefaultToolkit, getImage.
//Centrage de la fenêtre
Toolkit tk = [Link]();
Dimension d = [Link]();
int hauteurEcran = [Link];
int largeurEcran = [Link];
//Ajuster la taille et la position de la fenêtre.
[Link](largeurEcran/2, hauteurEcran/2);
[Link](largeurEcran/4,hauteurEcran/4);
3. Composants de base
1. Etiquette JLabel
Avec un Jlabel, on peut créer un texte « étiquette » et/ou une image. On peut également intégrer
du HTML, spécifier la position du texte par rapport { l’image ou spécifier l’emplacement par
rapport à son conteneur. Quelques méthodes publiques de cette classe :
JLabel(String, Icon, int) // Création d’un JLabel
void setText(String) // Modifie le texte du JLabel
String getText() // retourne le texte du Jlabel
void setIcon(Icon) et Icon getIcon()
// spécifier la position du texte par rapport à l’icone
void setHorizontalTextPosition(int)
void setVerticalTextPosition( int)
void setToolTipText(String) //associe un info bulles
© M. Lahmer 2002-2017 41
// Placer l Icon dans le label
[Link](soundIcon);
// Alligner le Texte à droite de l’icone
[Link]([Link]);
// Ajouter le label au panel
add(testLabel);}}
2. Bouton JButton
Comme le JLabel, on peut créer un JButton avec un texte (bien évidement HTML) et ou une icône.
//Création d’un Bouton avec icone
JButton precedent = new JButton("Precedent",leftButtonIcon);
//Création d’un Bouton avec texte HTML
new JButton("<html><h1>Ligne 1</h1></html>");
//positionnement du texte / à l’Icone
[Link]([Link]);
//Associer un raccourcis clavier au bouton ici p
[Link](KeyEvent.VK_P);
//associer une action à un bouton
[Link]("disable");
Quelques méthodes utiles
void setText(String) et String getText()
void setIcon(Icon)et Icon getIcon()
char getMnemonic() String getActionCommand()
void setEnabled(Boolean)
La classe abstraite JTextComponent est la classe mère de tous les composants permettant la
saisie de texte.
JTextField : entrer d’une seule ligne
JTextField tf= new JTextField();
[Link]("nouveau Texte");
JPasswordField : entrer un mot de passe non affiché sur l'écran
JPasswordField textfield = new JPasswordField (20);
[Link]('#');//* par defaut
char[] input = [Link]();
JTextArea : quelques lignes de texte avec une seule police de caractères
textArea = new JTextArea(5, 40);//lignes, colonnes
append(String) ajouter du texte à la fin
JTextPane : documents avec plusieurs polices et des images et composants inclus (pas
étudié dans cette partie du cours)
© M. Lahmer 2002-2017 42
4. Mise en page des composants dans un conteneur
Si vous ajoutez plusieurs composants à un conteneur sans spécifier de Layout, seul le dernier
sera visible. Les Layouts ou Layout Managers sont des classes qui implémentent une interface
LayoutManager, et représentent des modèles de positionnement des composants. On peut citer
comme exemples :
BorderLayout
BoxLayout
CardLayout
FlowLayout
GridBagLayout
GridLayout
GroupLayout
SpringLayout
1. FlowLayout
Quand un conteneur utilise FlowLayout, les composants sont arrangés dans l’ordre de leur ajout
dans le conteneur, depuis le haut, de gauche à droite. On ne passe à la prochaine ligne que quand
l’espace restant sur la ligne n’est plus suffisant pour contenir le composant. Il est utilisé par
défaut dans les applets.
© M. Lahmer 2002-2017 43
FlowLayout FLayout = new FlowLayout();
JFrame frm =new JFrame("FlowLayoutDemo");
…
[Link](FLayout);
[Link](new JButton("Button 1"));
[Link](new JButton("Button 2"));
[Link](new JButton("Button 3"));
[Link](new JButton("Long-Named Button 4"));
[Link](new JButton("5"));
2. BorderLayout
3. GridLayout
Le GridLayout arrange les composants dans un nombre donné de colonnes et de lignes. Il
commence en haut à gauche, et passe à la colonne suivante, et ainsi de suite, jusqu’{ la dernière
colonne, puis passe { la deuxième ligne de la première colonne, … etc. Le nombre de colonnes et
de lignes est spécifié dans les arguments du constructeur :
© M. Lahmer 2002-2017 44
new GridLayout(nombre_ligne, nombre_colonnes)
Le nombre de colonnes et de lignes ne peuvent pas être tous les deux des zéros. Si l’un ou l’autre
est un zéro, il est interprété comme à déterminer par le nombre des composants.
1. Principe
L'utilisateur utilise le clavier et la souris pour intervenir sur le déroulement du programme. Le
système d’exploitation engendre des événements { partir des actions de l’utilisateur ensuite le
programme doit lier des traitements { ces événements. On distingue deux types d’événement
Bas Niveau :
appui sur un bouton de souris ou une touche du clavier
relâchement du bouton de souris ou de la touche
déplacer le pointeur de souris
Logique
frappe d'un A majuscule
clic de souris
choisir un élément dans une liste
Le JDK utilise une architecture de type « observateur - observé ». Les composants graphiques
(comme les boutons) sont les observés. Chacun de ces composants a ses observateurs (ou
écouteurs, listeners). Ces écouteurs sont prévenus par le composant graphique dès qu’un
événement qui les concerne survient sur ce composant. Le code de ces écouteurs exécute les
actions { effectuer en réaction { l’événement.
2. Classes d’événements
© M. Lahmer 2002-2017 45
Ecouteur Composant
ActionEvent JButton, JList, JTextField, JMenuItem and its
ActionListener derivatives including JCheckBoxMenuItem,
addActionListener( ) JMenu, and JpopupMenu.
removeActionListener( )
3. Ecouteur vs Adaptateur
Pour éviter au programmeur d’avoir { implanter toutes les méthodes d’une interface « écouteur
», AWT fournit des classes (on les appelle des adaptateurs), qui implémentent toutes ces
© M. Lahmer 2002-2017 46
méthodes. Le code des méthodes ne fait rien. Ça permet au programmeur de ne redéfinir dans
une sous-classe que les méthodes qui l’intéresse.
Les classes suivantes du paquetage [Link] sont des adaptateurs : KeyAdapter,
MouseAdapter, MouseMotionAdapter, FocusAdapter, ComponentAdapter,
WindowAdapter.
Supposons que vous voulez traiter le clique de la souris donc il suffit d’implémenter le
traitement de la méthode mouseClicked comme suit :
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
[Link](0);}});
Mais si vous utilisez un Listener au lieu d’un Adapter il faut implémenter toutes les méthodes de
l’interface MouseListener.
Listener vs. adapter Methods in interface
ActionListener actionPerformed(ActionEvent)
AdjustmentListener adjustmentValueChanged( AdjustmentEvent)
ContainerListener componentHidden(ComponentEvent)
ContainerAdapter componentShown(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent)
FocusListener focusGained(FocusEvent)
FocusAdapter focusLost(FocusEvent)
KeyListener keyPressed(KeyEvent)
KeyAdapter keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener mouseClicked(MouseEvent)
MouseAdapter mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener mouseDragged(MouseEvent)
MouseMotionAdapter mouseMoved(MouseEvent)
Cette classe décrit des événements de haut niveau très utilisés qui correspondent à un type
d’action de l’utilisateur qui va le plus souvent déclencher un traitement (une action) :
clic sur un bouton
return dans une zone de saisie de texte
choix dans un menu
© M. Lahmer 2002-2017 47
Ces événements sont très fréquemment utilisés et ils sont très simples à traiter. Un objet
ecouteur intéressé par les événements de type « action » (classe ActionEvent) doit appartenir à
une classe qui implémente l’interface [Link]. L’exemple suivant affiche
le nombre de clique sur le bouton ok dans le bouton lui-même.
//Fenetre est un écouteur de ActionEvent
class Fenetre extends JFrame implements ActionListener{
int nbClique=0;
public Fenetre(){
JButton ok=new JButton(’’OK’’+nbClique);
//inscription du bouton ok auprès de l’écouteur
[Link](this);
getContentPane().add(ok);}
© M. Lahmer 2002-2017 48
2. JRadioButton
Dans awt, les boutons radio sont des checkboxs qui appartiennent au même CheckboxGroup.
Swing offre un nouveau composant qui est JRadioButton et qu’on peut est ajouté { un
ButtonGroup. Comme CheckboxGroup, le ButtonGroup est un composant logique qui n’a aucun
effet visuel
ButtonGroup Payement = new ButtonGroup();
JRadioButton btrCheque = new JRadioButton("Chèque");
JRadioButton btrEspece = new JRadioButton("Espèce");
// ajouter le bouton au groupe
[Link] (btrCheque);
[Link] (btrEspece);
[Link](true); [Link](E);
Méthodes Rôles
insertItemAt(Objetc , int) Ajouter / Récupérer un élément dans une position
Object getItemAt(int) ou spécifique ou sélectionné
Object getSelectedItem()
removeAllItems() removeItemAt(int) Supprimer un ou plusieurs éléments
void removeItem(Object)
setEditable(Boolean) Modifier l’état de la Combo et récupérer le
isEditable()/getItemCount() nombre d’éléments
ActionListener Les écouteurs possibles
ItemListener
Une JList permet d’afficher des valeurs sous forme d’une ou plusieurs colonnes et est
généralement intégrée dans une JScrollPane. Une JList est un composant qui implémente le
Modèle MVC { l’instar de JTable, JTree,…
Création d’une JList
© M. Lahmer 2002-2017 49
JList list = new JList(data); //data de type Object[]
Quelques méthodes
Le plus important dans une JList est de pouvoir récupérer l’élément ou les éléments
sélectionnés. Pour cela plusieurs méthodes sont disponibles :
Méthodes Rôles
int getSelectedIndex() Récupérer l’indexe de l’élément sélectionné
int getMinSelectionIndex() Récupérer l’indexe minimal est maximal de la sélection
int getMaxSelectionIndex()
int[] getSelectedIndices() Récupérer tous les indexes sélectionnés dans un tableau
en ordre croissant
Object getSelectedValue() Récupérer l’objet sélectionné au lieu de l’indice,
n’oublier pas de faire le cast
Object[] getSelectedValues() Récupérer les objets sélectionnés dans un tableau en
ordre croissant
L’utilisation standard d’une liste est de demander { l’utilisateur de cliquer sur un bouton
lorsqu’il a fini de faire ses choix dans la liste. Par ailleurs Il est rare d’écrire un écouteur de liste
et on récupère alors la sélection de l’utilisateur par une des méthodes présentées ci-dessus.
Sinon, La classe d'un écouteur de liste doit implémenter l'interface ListSelectionListener qui
contient la méthode void valueChanged(ListSelectionEvent e).
Modèle de JList
On peut créer une JList en l’associant { modèle qui fournit les données affichées par la liste :
public JList(ListModel dataModel). ListModel est une interface dont le corps est ci-
dessous :
public interface ListModel {
int getSize();
Object getElementAt(int i);
© M. Lahmer 2002-2017 50
void addListDataListener(ListDataListener l);
void removeListDataListener(ListDataListener l);}
Pour écrire une classe qui implémente ListModel, le plus simple est d'hériter de la classe
abstraite AbstractListModel qui implémente les 2 méthodes de ListModel qui ajoutent et
enlèvent les écouteurs. Les plus simples ont un modèle de la classe DefaultListModel qui
hérite de la classe AbstractListModel et offre des méthodes d’ajout, de suppression et de
récupération des éléments de la JList.
Exemple
ListModel pays = new DefaultListModel();
[Link]("Maroc");
[Link]("France");
[Link]("Italie");
[Link]("Espagne");
JList liste = new JList(pays);
Création d’un nouveau modèle
Pour créer un nouveau modèle de JList il suffit d’étendre la classe AbstractListModel et
d’implémenter les méthodes dont vous avez besoins.
import [Link].*;
class ProduitModel extends AbstractListModel
{
public Vector produits;
public ProduitModel()
{produits = new Vector();}
public int getSize(){return [Link](); }
public Object getElementAt(int j)
{return [Link](j);}
public void addElement(Object a)
{[Link](a);
[Link](this,0,getSize()-1);
}}
JOptionPane est un composant léger, classe fille de Jcomponent elle permet d’avoir très
simplement les cas les plus fréquents de fenêtres de dialogue message d'information avec
bouton OK (showMessageDialog) demande de confirmation avec boutons Oui, Non et Cancel
(showConfirmDialog) possibilité de configurer les boutons avec showOptionDialog saisie
d'une information sous forme de texte, showInputDialog. JDialog (composant lourd) est
utilisée pour les cas non prévues par JOptionPane .
Les arguments complets de JoptionPane sont :
Component frame // associée à la boite de dialogue
Object message // message à afficher
© M. Lahmer 2002-2017 51
String titre // le titre de la boite de dialogue
int TypeBouton // spécifier les boutons à faire apparaître
int TypeIcone // détermine l’icône à afficher
Object[] options // le message à afficher sur chaque bouton
Object initialValue // le bouton sélectionné par défaut
Pour afficher un message d’erreur :
[Link](null, "Erreur de saisie", "alert",
JOptionPane.ERROR_MESSAGE);
Pour afficher un message de confirmation avec deux boutons oui/non par défaut
[Link](null,
"Voulez vous vraiment Quitter", "Quitter", JOptionPane.YES_NO_OPTION);
On peut indiquer un type de message qui indiquera l'icône affichée en haut, à gauche de la
fenêtre (message d'information par défaut)
JOptionPane.INFORMATION_MESSAGE
JOptionPane.ERROR_MESSAGE
JOptionPane.WARNING_MESSAGE
JOptionPane.QUESTION_MESSAGE
JOptionPane.PLAIN_MESSAGE (pas d’icône)
Les types de boutons à afficher dépendent de la méthode appelée :
showMessageDialog : bouton Ok
showInputDialog : Ok et Cancel
showConfirmDialog : dépend du paramètre passé ; les différentes possibilités
sont :
DEFAULT_OPTION
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CANCEL_OPTION
showOptionDialog : selon le tableau d'objet passé en paramètres (vous pouvez
franciser le texte à afficher sur les boutons)
© M. Lahmer 2002-2017 52
String [] options={"oui","non"};
int n =
[Link](this,
"voulez vous vraiment Quitter?","Quitter",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,
null,options,options[0]);
if(n==1) [Link]();
6. Les Menus
Le modèle d’utilisation des menu swing est { peut prêt identique { celui des awt. Les classes de
menu (JMenuItem, JCheckBoxMenuItem, JMenu, et JMenuBar) sont toutes des sous classe de
Jcomponent. Donc on peut placer un JMenuBar dans conteneur par setMenuBar(). On peut
associer une icône à un JMenuItem. JPopupMenu ou Les menus pop-up sont des menus qui
apparaissent à la demande (click bouton droit de la souris)
Exemple de construction de Menu
On va créer un menu Fichier avec trois options (nouveau, ouvrir et fermer).
//Création d’une barre de menu
JMenuBar jmb = new JMenuBar();
//Création d’un menu fichier
JMenu fichier = new JMenu ("Fichier");
[Link](KeyEvent.VK_F);
//Ajouter des éléments au menu Fichier
JMenuItem itemNew,itemOpen,itemClose;
itemNew = new JMenuItem ("Nouveau") ;
itemOpen = new JMenuItem ("Ouvrir") ;
itemClose =new JMenuItem ("Fermer");
[Link] (itemNew);
[Link] (itemOpen);
//Ajout d’un séparateur de menu
[Link]();
[Link](itemClose) ;
//Ajouter le menu fichier à la barre de menu
[Link] (fichier);
//Ajouter le menu à la fenêtre
[Link](theJMenuBar);
© M. Lahmer 2002-2017 53
Exemple de JToolBar
//Création d’une barre d’outils
JToolBar toolbar = new JToolBar();
//Ajouter un élément à la barre d’outils
JButton ouvrir=new JButton();
[Link](("images/[Link]");
[Link](ouvrir);
//Désactiver le déplacement de la barre d’outils
[Link] (false);
7. JTabedPane (Onglets)
JTabedPane permet à un utilisateur de switcher parmi plusieurs onglets par clique. Chaque
onglet est composé d’un titre, d’un pannel et éventuellement une image. L’ajout des onglets
au TabedPane est effectué par la méthode addTabe ou insertTab. Chaque onglet disposé d’un
indexe correspondant à la position dont laquelle il a été ajouté, le premier est indexé par 0 et
le dernier par n-1 ou n est le nombre d’onglets ajoutés
© M. Lahmer 2002-2017 54
7. Accès aux bases de données en JDBC
1. Principe
JDBC est une API fournie avec Java permettant l'accès à n'importe quelle base de données locale
ou à travers un réseau. Le principe de fonctionnement est comme suit :
Chaque base de données utilise un pilote (driver) qui lui est propre et qui permet de
convertir les requêtes JDBC dans le langage natif du SGBDR.
Ces drivers dits JDBC (un ensemble de classes et d’interfaces Java) existent pour tous les
principaux constructeurs : Oracle, Sybase, Informix, SQLServer, MySQL, MsAccess, …
2. Mise en œuvre
Toutes les classes et les interfaces nécessaires à la connexion à la base de données et son
exploitation sont fournis par l’api [Link]. Les étapes à suivre pour mettre en place une
application java basée sur JDBC sont :
1. Charger le driver JDBC
Utiliser la méthode de chargement à la demande forName() de la classe Class comme suit :
[Link]("Nom du driver");
Exemples de drivers :
[Link] : pour access fournis par JDK
[Link] : pour oracle non fournis
[Link]. SQLServerDriver : SqlServer non fournis
© M. Lahmer 2002-2017 55
Code de chargement :
try { [Link]("[Link]").
newInstance();
[Link]("Tout est OK"); }
catch (Exception e) { [Link]("Erreur de drivers
JDBC"); }
3. Exécuter la requête
La manipulation des données se fait à travers un objet de type ResultSet. Différentes méthodes
vous permettent de récupérer la valeur des champs de l'enregistrement courant.
Ces méthodes commencent toutes par get, immédiatement suivi du nom du type de données (ex:
getString). Chaque méthode accepte soit l'indice de la colonne (à partir de 1) soit le nom de la
colonne dans la table :
© M. Lahmer 2002-2017 56
boolean getBoolean(int); boolean getBoolean(String); byte getByte(int); byte getByte(String);
Date getDate(int); Date getDate(String); double getDouble(int); double getDouble(String); float
getFloat(int); float getFloat(String); int getInt(int); int getInt(String); long getLong(int); long
getLong(String); short getShort(int); short getShort(String); String getString(int); String
getString(String);
String strQuery = "SELECT * FROM T_Users;";
ResultSet rsUsers = [Link](strQuery);
while([Link]()) {
[Link]("Id[" + [Link](1) + "]" + "Pass[" +
[Link]("Password") ); }
Pour parcourir un ResultSet dans tous les sens (premier, dernier, suivant et précédent) Il faut
passer des paramètres splémentaires à la méthode createStatement de l'objet de connexion :
stm = [Link](type, mode);
Type :
o ResultSet.TYPE_FORWARD_ONLY
o ResultSet.TYPE_SCROLL_SENSITIVE
o ResultSet.TYPE_SCROLL_INSENSITIVE
Mode :
o ResultSet.CONCUR_READ_ONLY
o ResultSet.CONCUR_UPDATABLE
Pour le type scroll, on a les possibilités de parcours first, last , next et previous. A titre d’exemple
pour modifier le premier enregistrement de la table T_Users
[Link](); // Se positionne sur le premier enregistrement
[Link]("Password", "toto"); // Modifie la valeur du password
[Link](); //Applique les modifications sur la base
Avant de quitter l’application il faut fermer les différents espaces ouverts à savoir rsUsers, stm et
cnx
3. PreparedStatement et CollablStatement
© M. Lahmer 2002-2017 57
PreparedStatement ps =
[Link]("UPDATE emp SET sal = ? WHERE name = ?");
for(int i = 0; i < 10; i++) {
[Link](1, salary[i]);
[Link](2, name[i]);
int count = [Link](); }
Les arguments dynamiques sont spécifiés par un "?" ils sont ensuite positionnés par les
méthodes setInt() , setString() , setDate() , … de PreparedStatement et setNull() positionne
le paramètre à NULL (SQL). Ces méthodes nécessitent 2 arguments, le premier (int) indique le
numéro relatif de l’argument dans la requête et le second indique la valeur à positionner.
CallableStatement : utilisée pour exécuter une procédure sql stockée. Exemple d’addition
/*
--EXECUTE ADDITION 10,25,NULL
ALTER PROCEDURE ADDITION
@A INT
, @B INT
, @C INT OUT
AS
SELECT @C = @A + @B
*/
CallableStatement cs2 = [Link]("{call ADDITION(?,?,?)}");
[Link](3,[Link]);
[Link](1,10);
[Link](2,25);
[Link]();
int res = [Link](3);
[Link](res);
4. Les métadonnées
JDBC permet de récupérer des informations sur le type de données que l'on vient de récupérer
par un SELECT (interface ResultSetMetaData), mais aussi sur la base de données elle-même
(interface DatabaseMetaData). Les données que l'on peut récupérer avec DatabaseMetaData
dépendent du SGBD avec lequel on travaille.
Récupération des méta-données select
© M. Lahmer 2002-2017 58
Récupération des méta-données de la base
© M. Lahmer 2002-2017 59
8. Client / Serveur en RMI
1. Définition
Appel de méthode à distance (Remote Methode Invocation) est une technologie sun
développée depuis JDK 1.1 qui permet { un objet java s’exécutant sur une machine
cliente d’invoquer des méthodes sur un objet s’exécutant sur une autre machine serveur.
L’API rmi décharge le développeur de toute connaissance sur les réseaux (protocoles
TCP, socket, format de données,….) et l’appelle de méthodes se fait d’une façon
transparente.
2. Mise en œuvre
1. principe
Le développement d’une application distribuée RMI peut être décomposé en deux parties :
Côté serveur
La définition d'une interface qui contient les méthodes qui peuvent être appelées
à distance
L'écriture d'une classe qui implémente cette interface
L’enregistrement de l’objet distant dans le registre de noms RMI (RMI Registry)
Côté client
L'obtention d'une référence sur l'objet distant à partir de son nom
L'appel à la méthode à partir de cette référence
2. Exemple
L’objectif est de mettre en place une application RMI qui permettra { un client d’appeler
une méthode addition(a,b) sur un objet distant calcule.
© M. Lahmer 2002-2017 60
- Définition de l’interface calcule qui contiendra les services { appeler { distance :
import [Link].*;
public interface Calcul extends Remote {
public double addition(double a, double b) throws RemoteException;}
import [Link];
import [Link];
public class CalculImpl extends UnicastRemoteObject implements Calcul
{
protected InformationImpl() throws RemoteException {
super();}
public double addition(double x, double y) throws RemoteException {
return a+b ;}
- Enregistrement dans l’annuaire RmiRegistry (Main)
import [Link];
import [Link];
class Main{
public static void main(String[] args) {
int port=1099;
[Link](port)
CalculImpl srv = new CalculImpl();
String url = "rmi://@serveur:”+port+”/Reference";
[Link](url, srv);
[Link]("Serveur lance :");
} catch (Exception e) { [Link]();}
}
}
- Côté client en recherché l’objet distant par sa référence dans l’annuaire et appeler la
méthode.
import [Link];
import [Link];
public class Client {
public static void main(String[] args) {
try {
Remote serveur = (Calcul)[Link]("rmi://@serveur:1099/Reference ");
[Link]("Resulta = " + [Link](10,20));
}
} catch (NotBoundException e) {
[Link]();
}
}
© M. Lahmer 2002-2017 61