Académique Documents
Professionnel Documents
Culture Documents
–BENI
(I.S.C.)
1
Par
MUHINDO NGAINGAI Alphée,
-Chef de Travaux-
Bertrand Braunschweig
INTRODUCTION GENERALE
La programmation classique telle qu’étudiée au travers des
langages C, Pascal… définie un programme comme étant un ensemble de
données sur lesquelles agissent des procédures et des fonctions. Les
3
BIBLIOGRAPHIE SELECTIVE
Hugues Bersini (2014). La programmation orientée objet Cours et
sur www.siteduzero.com
CampusPress.
Eyrolles.
6
Eyrolles.
Dunod.
Editions.
Editions.
Editions.
CHAPITRE I
mécanismes procéduraux.
On y rencontre des variables, des arguments, des boucles, des arguments
de fonction, des instructions conditionnelles, tout ce que l’on trouve
classiquement dans les boîtes à outils procédurales. L’Orienté Objet ne
permet en rien de faire l’économie du procédural, simplement, il
complémente celui-ci, en lui superposant un système de découpe plus
naturel et facile à mettre en œuvre. Il n’est guère surprenant que la
plupart des langages procéduraux comme le C, Cobol ou, plus
récemment, PHP, se soient relativement aisément enrichi d’une couche
dite Orienté Objet sans que cette addition ne remette sérieusement en
question l’existant procédural. Cependant, l’impact de cette couche
additionnelle ne se limite pas à quelques structures de données
supplémentaires afin de mieux organiser les informations manipulées par
le programme. Il va bien au-delà. C’est toute une manière de concevoir
un programme et la répartition de ses parties fonctionnelles qui est en
jeu. Les fonctions et les données ne sont plus d’un seul tenant mais
éclatées en un ensemble de modules reprenant, chacun, une sous-partie
de ces données et les seules fonctions qui les manipulent. Il faut
réapprendre à programmer en s’essayant au développement d’une
succession de microprogrammes et au couplage soigné et réduit au
minimum de ces microprogrammes. En substance, la programmation
Orienté Objet pourrait reprendre à son compte ce slogan devenu très
célèbre parmi les adeptes des courants altermondialistes : « agir
localement, penser globalement ».
Objet.
3. La programmation Orienté Objet pourrait reprendre à son compte
ce slogan : « agir localement, penser globalement ».
Exemple
Voici quelques ensembles constituant ainsi des classes : Etudiant,
Voiture,
Véhicule, Bus, Facture, Logiciel, Bouton, Feuilles, Pages, Rectangle, …
Importance d’une classe
Une classe est une sorte de moule ou une sorte de plan ou
maquette qui permettra de créer les objets qu’on voudra.
I.2.2. Propriété
Les caractéristiques communes aux éléments d‘une classe
permettent de différencier les éléments appartenant à la classe. Elles
sont appelées « données membres » ou « propriétés ».
Les données à stocker dans un programme orienté objet sont stockées
14
Et lorsque nous avons plusieurs variables d'un même type, nous pouvons
résumer tout ceci à une déclaration :
int nbre1 = 2, nbre2 = 3, nbre3 = 0;
Ici, toutes les variables sont des entiers, et toutes sont initialisées.
I.2.3. Méthodes
15
I.2.5. Package
Définition
Utilisation
Pour utiliser les classes (les attributs et les méthodes de ces
classes) d‘un package dans une autre classe, le programmeur doit
importer ce package dans sa classe comme suit :
import nom_package.*; pour accéder à toutes les classes du package
Ou pour accéder directement à une classe spécifique
import nom_package.nom_classe ;
Utilisation des packages d’entrée et sortie (en mode console)
Pour afficher des sorties à l‘écran, on utilise la classe « System »
du package Java.lang. Comme ce package est importé par défaut lors
du lancement de NetBeans aucune importation n‘est nécéssaire pour
l‘affichage. Il suffit donc d‘utiliser la syntaxe suivante :
System.out.print(); ou
System.out.println(); // Affiche et retourne à la ligne
Le messages à afficher sont mises entre les parenthèses et concaténés
par des +.
Les messages sont entre guillemets mais pas les variables.
18
coincé par sa classe, même s’il s’y sent parfois à l’étroit. Dans les
langages OO, la classe est le modèle à respecter stricto sensu, comme
une maison le fait du plan de l’architecte, et la robe du patron du
couturier.
En résumé, les objets contiennent des attributs et des méthodes. Les
attributs sont des variables ou des objets nécessaires au fonctionnement
de l'objet. En java, une application est un objet. La classe est la
description d'un objet. Un objet est une instance d'une classe. Pour
chaque instance d'une classe, le code est le même, seul les données sont
différentes à chaque objet.
Instanciation
Un objet est une instance (anglicisme signifiant « cas » ou «
exemple ») d‘une classe et est référencé par une variable ayant un état
(ou valeur). Pour créer un objet, il est nécessaire de déclarer une
variable dont le type est la classe à instancier puis de faire appel à un
constructeur de cette classe ou faire ces deux opérations dans une seule
instruction.
L'opérateur new se charge de créer une instance de la classe et de
l'associer à la variable
I.2.7. Méthode constructeur
Chaque classe doit définir une ou plusieurs méthodes particulières
appelées des constructeurs. Un constructeur est une méthode invoquée
lors de la création d‘un objet. Cette méthode, qui peut être vide,
effectue les opérations nécessaires à l‘initialisation d‘un objet. Chaque
constructeur doit avoir le même nom que la classe où il est défini et n‘a
aucune valeur de retour (c‘est l‘objet créé qui est renvoyé) et peut être
avec ou sans paramètres. Pour ce faire, on utilise le mot clé new.
Sommes toutes, Un constructeur est une méthode (ou méthode
d'instance, vu qu'elle interagit avec une instance de votre classe) qui va
20
//la méthode
int calculAge(int anneeCours){
return anneeCours-this.anneeNaissance;
}
23
}
Vous constatez la présence du mot clé public qui s’ajoute par défaut.
C’est le principe d’encapsulation (nous y reviendrons dans les lignes
suivantes). A fait, Une variable, méthode ou classe déclarée public est
visible par tous les autres objets.
Utilisation de méthodes « constructeurs » en Java
A titre de rappel, la déclaration d'un objet est suivie d'une sorte
d'initialisation par le moyen d'une méthode particulière appelée
constructeur pour que les variables aient une valeur de départ. Elle n'est
systématiquement invoquée que lors de la création d'un objet.
Le constructeur suit la définition des autres méthodes excepté que son
nom doit obligatoirement correspondre à celui de la classe et qu'il n'est
pas typé, pas même void, donc il ne peut pas y avoir d'instruction return
dans un constructeur. On peut surcharger un constructeur. La définition
d'un constructeur est facultative. Si elle n'est pas définie, la machine
virtuelle appelle un constructeur par défaut vide créé automatiquement.
Dès qu'un constructeur est explicitement défini, Java considère que le
programmeur prend en charge la création des constructeurs et que le
mécanisme par défaut, qui correspond à un constructeur sans
paramètres, est supprimé. Si on souhaite maintenir ce mécanisme, il faut
définir explicitement un constructeur sans paramètres.
Une classe peut contenir plusieurs constructeurs. Ceux-ci doivent porter
le nom de la classe et être distincts par leurs arguments (nombre et/ou
types).
Syntaxe Java
public NomClasse()
{ //Constructeur par defaut
this.Propriété1=valeur1;
this.Propriété2=valeur2 ;
24
…
this.Propriétén=valeurn
}
ou on peut créer le constructeur parametré comme ceci:
public NomClasse(type param1,type param2,…,type paramn) {
this.propriété1 = param1;
this.propriété2 = param2;
…
this.propriétén = paramn;
}
Exemple Pratique:
Ajoutons les constructeurs (par défaut ainsi que celui avec
paramètre) pour la classe Etudiant, créée précédemment. On obtient :
package classeprincipale;
public class Etudiant {
//les proprietes
String matricule;
int anneeNaissance;
//la methode
int calculAge(int anneeCours){
return anneeCours-this.anneeNaissance;
}
/*Les méthodes constructeurs
* ****************************
*/
//Constructeur par défaut
public Etudiant(){
this.matricule="";
this.anneeNaissance=2019;
25
}
//Constructeur paramétré
public Etudiant(String mat,int an){
this.matricule=mat;
this.anneeNaissance=an;
}
}
L’opération d’Instanciation
Rappelons que l’instanciation est l’opération par laquelle on crée
des objets à partir d’une classe. Pour ce faire, il est nécessaire de
déclarer une variable dont le type est la classe à instancier puis de faire
appel à un constructeur de cette classe ou faire ces deux opérations dans
une seule instruction.
La syntaxe est :
NomClasse NomObj=new NomConstructeur
Cas pratique : créons un objet « Etudiant » ayant le matricule Y.1458/18
et est né en 1985. Le programme devra afficher son âge sur l’exécution
de la méthode « calculAge » en fonction d’une année considérée comme
année en cours (2000). Sous forme d’un message du type : « Votre
matricule est : Y.1458/18 et en 2000 vous aviez 15 ans. » Pour ce faire,
rendez vous dans la méthode principale (main) de la classe principale,
et appelez le constructeur paramétré comme ceci :
package classeprincipale;
public class ClassePrincipale {
"+unEtudiant.calculAge(2000)+" ans");
}
Il y a lieu de spécifier l’année en cours comme année système c’est-à-
dire l’année récupéré à partir de l’ordinateur sur lequel le script
s’exécute. Pour ce faire, utilisez la méthode now de la classe Year du
package java.time (à importer en cas de nécessité) comme suit :
Year.now().getValue(); ou LocalDate.now.getYear() ;
Il est aussi possible d’instancier le constructeur par défaut, c’est-à-dire
les parenthèses resterons vides sans paramètres. En retenant 2019
comme année en cours, vous obtenez ceci :
package classeprincipale;
public class ClassePrincipale {
public static void main(String[] args) {
// TODO code application logic here
//Etudiant unEtudiant=new Etudiant("Y.1458/18 ",1985);
Etudiant unEtudiant=new Etudiant();
System.out.println("Vos coordonnees\nVotre matricule est
:"+unEtudiant.matricule+" et vous avez "+unEtudiant.calculAge(2019)+"
ans");
}
Vous constatez que le matricule est vide et l’âge retourné est 0 ans
I.2.8. Héritage
La notion d’héritage est une relation entre différentes classes
permettant de définir une nouvelle classe en se basant sur les classes
27
Lors de la création d'une classe « mère » il faut tenir compte des points
suivants :
- la définition des accès aux variables d'instances, très souvent
privées, doit être réfléchie entre protected et private
- pour empêcher la redéfinition d'une méthode (surcharge) il faut
la déclarer avec le modificateur final
Lors de la création d'une classe fille, pour chaque méthode héritée qui
n'est pas final, il faut envisager les cas suivant :
- la méthode héritée convient à la classe fille : on ne doit pas la
redéfinir
- la méthode héritée convient mais partiellement du fait de la
spécialisation apportée par la classe fille : il faut la redéfinir voir
la surcharger. La plupart du temps une redéfinition commencera
par appeler la méthode héritée (via super) pour garantir
l’évolution du code
- la méthode héritée ne convient pas : il faut redéfinir ou surcharger
la méthode sans appeler la méthode héritée lors de la redéfinition.
Exemple Pratique :
Soit la classe Personne et la classe Etudiant. Un étudiant est
d’abord une personne. Donc la classe Etudiant hérite toutes les
caractéristiques et tous les comportements de la classe Personne au quel
elle ajoute les autres attributs et méthodes spécifiques. Une personne
est caractérisée par un nom, un post nom, une adresse, un genre et une
année de naissance. Si la classe Etudiant hérite de la classe Personne
this.nom = "Nouveau";
this.postnom = "Nouveau";
this.adresse = "Nouveau";
this.genre = "Masculin";
this.anneeNaiss =Year.now().getValue();
}
//3.Constructeur avec parametres
public Personne(String sonNom, String sonPostNom,String
sonAdresse, String sonGenre, int sonAnnee){
this.nom = sonNom;
this.postnom = sonPostNom;
this.adresse = sonAdresse;
this.genre = sonGenre;
this.anneeNaiss = sonAnnee;
}
//4. methode afficher la personne
public void afficher(){
System.out.println("Le nom est "+this.nom+"\nLe postnom
est:"+this.postnom+"\nVotre adresse:"+this.adresse+"\nVous etes du
genre:"+this.genre+"\nL'annee de naissance est "+this.anneeNaiss+"\n
Donc vous etes age de "+this.calculAge(2019)+" ans");
}
}
/**
*
32
* @author NGAINGAI
*/
public class Etudiant extends Personne {
//les proprietes
String matricule;
String promotion;
String option;
/*Les méthodes
* **********************
*/
//1. méthode pour trouver le total de frais à payer
public int payer()
{
int tot = 0;
if (this.option.equals("Sciences commerciales"))
{
if (this.promotion.equals("G1") ||
this.promotion.equals("G2") || this.promotion.equals("G3"))
tot = 280;
else
tot = 380;
}
else
{
if (this.promotion.equals("G1") ||
this.promotion.equals("G2") || this.promotion.equals("G3"))
tot = 300;
else
tot = 400;
}
return tot;
}
//Constructeur
public Etudiant(String pn, String psn,String pad, String pgr, int
pan, String mat, String prom, String opt){
super(pn,psn, pad, pgr, pan);
this.matricule = mat;
this.promotion = prom;
this.option = opt;
}
public void afficher(){
System.out.println("Le matricule est "+this.matricule+"\nLe
33
nom est "+super.nom+"\nLe postnom est:"+super.postnom+"\nVotre
adresse:"+super.adresse+"\nVous etes du genre
"+super.genre+"\nVous etes inscrit en:"+this.promotion+"
"+this.option+"\nL'annee est "+super.anneeNaiss+" Donc vous etes
Age de "+super.calculAge(2019)+" ans");
}
}
package classeprincipale;
/**
* @author NGAINGAI
*/
public class ClassePrincipale {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//Instanciation d'une personne
Personne pers=new Personne("SOKI", "NGANZULE","NTONY",
"FEMININ", 1996);
//Instanciation d'un etudiant
Etudiant unEtudiant=new Etudiant("SOKI",
"NGANZULE","NTONY", "FEMININ", 1996, "X.2456/17", "G3", "GI");
//affichage de la personne
pers.afficher();
//affichage de l'etudiant
unEtudiant.afficher();
}
Découvrez le résultat !
Vous venez de constater que toutes les deux classes ont une méthode
« afficher » mais qui ne s’appelle pas de la même manière selon que
l’on veut afficher une personne ou un étudiant. C’est la notion du
polymorphisme.
34
I.2.9. Polymorphisme
Il est possible de donner le même nom à deux méthodes différentes
à condition que les signatures de ces deux méthodes soient différentes.
La signature d'une méthode comprend le nom de la classe, le nom de la
méthode et les types des paramètres. Cette facilité permet de mettre
en œuvre le polymorphisme.
Le terme polymorphisme issu du grec signifie la faculté de prendre
plusieurs formes. Une entité est polymorphe si à l’exécution elle peut
se référer à des instances de classe différentes. Le polymorphisme est
un mécanisme qui permet à une sous classe de redéfinir une méthode
dont elle a hérité tout en gardant la même signature de la méthode.
La signature d’une méthode représente la précision de son nom, du
type de ses arguments et du type de donnée retournée. Toutefois, le
polymorphisme est une surcharge d’une méthode. En effet, Plusieurs
méthodes sont généralement déclarées dans une classe et certaines
d’entre elles peuvent porter le même nom. Elles doivent alors se
distinguer par le nombre ou le type de leurs arguments. On parle alors
de « surcharge » de méthode (overloading en anglais). Deux méthodes
d’une même classe ne peuvent cependant pas porter le même nom,
accepter les mêmes arguments et être seulement distinctes par le type
de la valeur de retour.
La surcharge facilite l'utilisation des propriétés ou des méthodes, car elle
propose un choix de divers types de données disponibles. Au moment de
l'exécution, Java appelle la procédure correcte en fonction des types de
données des paramètres spécifiés.
Exemple pratique :
A. Dans l’illustration des notions sur l’héritage, vous avez constaté
que toutes les deux classes ont une méthode « afficher » mais qui
ne s’appelle pas de la même manière selon que l’on veut afficher
une personne ou un étudiant. C’est la redéfinition de la méthode.
Il est temps de voir comment on peut surcharger une méthode.
B. Créons tout de suite dans la classe étudiant un constructeur
surchargé pour vous monter ce que cela implique:
package classeprincipale;
import java.time.Year;
public class Etudiant extends Personne {
//les proprietes
String matricule;
String promotion;
String option;
/*Les méthodes
* **********************
*/
36
super.nom = "";
super.postnom = "";
super.adresse = "";
super.genre = "Masculin";
super.anneeNaiss =Year.now().getValue();
37
this.matricule = "";
this.promotion = "G1";
this.option = "Sciences commerciales";
}
public Etudiant(String pn, String psn,String pad, String pgr, int pan,
String mat, String prom, String opt){
super(pn,psn, pad, pgr, pan);
this.matricule = mat;
this.promotion = prom;
this.option = opt;
}
public void afficher(){
System.out.println("Le matricule est "+this.matricule+"\nLe nom est
"+super.nom+"\nLe postnom est:"+super.postnom+"\nVotre
adresse:"+super.adresse+"\nVous etes du genre "+super.genre+"\nVous
etes inscrit en:"+this.promotion+" "+this.option+"\nL'annee est
"+super.anneeNaiss+" Donc vous etes Age de "+super.calculAge(2019)+"
ans\nVotre montant total de frais a payer est de "+this.payer() +" $");
}
}
Ici j'ai donc déclaré dans ma classe Etudiant, 2 constructeurs différents,
j'ai donc surchargé le constructeur. Deux fonctions avec des arguments
de type différent apportent aussi une surcharge.
/**
*
* @author NGAINGAI
*/
public class Etudiant extends Personne {
//les proprietes
String matricule;
String promotion;
String option;
/*Les méthodes
* **********************
*/
//1. méthode pour trouver le total de frais à payer
public int payer()
{
int tot = 0;
if (this.option.equals("Sciences commerciales"))
{
if (this.promotion.equals("G1") || this.promotion.equals("G2") ||
this.promotion.equals("G3"))
tot = 280;
39
else
tot = 380;
}
else
{
if (this.promotion.equals("G1") || this.promotion.equals("G2") ||
this.promotion.equals("G3"))
tot = 300;
else
tot = 400;
}
return tot;
}
//Constructeurs
public Etudiant(){
super.nom = "";
super.postnom = "";
super.adresse = "";
super.genre = "Masculin";
super.anneeNaiss =Year.now().getValue();
this.matricule = "";
this.promotion = "G1";
this.option = "Sciences commerciales";
}
public Etudiant(String pn, String psn,String pad, String pgr, int pan,
String mat, String prom, String opt){
super(pn,psn, pad, pgr, pan);
this.matricule = mat;
this.promotion = prom;
40
this.option = opt;
}
@Override
public void afficher(){
System.out.println("-----------------AFFICHAGE DE L'ETUDIANT----------
----\nLe matricule est "+this.matricule+"\nLe nom est "+super.nom+"\nLe
postnom est:"+super.postnom+"\nVotre
adresse:"+super.adresse+"\nVous etes du genre "+super.genre+"\nVous
etes inscrit en:"+this.promotion+" "+this.option+"\nL'annee est
"+super.anneeNaiss+" Donc vous etes Age de "+super.calculAge(2019)+"
ans\nVotre montant total de frais a payer est de "+this.payer() +" $");
}
}
I.2.10. Les Interfaces (Il ne s'agit pas ici d'interfaces graphiques...)
Avec l'héritage multiple, une classe peut hériter en même temps
de plusieurs super classes. Ce mécanisme n'existe pas en java. Les
interfaces permettent de mettre en œuvre un mécanisme de
remplacement.
Une interface est un ensemble de constantes et de déclarations de
méthodes correspondant un peu à une classe abstraite. C'est une sorte
de standard auquel une classe peut répondre. Tous les objets qui se
conforment à cette interface (qui implémentent cette interface)
possèdent les méthodes et les constantes déclarées dans celle−ci.
dériver.
Les trois rôles que ces interfaces sont appelées à jouer : forcer
l’implémentation de leurs méthodes, permettre le multihéritage,
faciliter et stabiliser la décomposition de l’application logicielle.
Les interfaces se déclarent avec le mot clé interface et sont intégrées
aux autres classes avec le mot clé implements. Une interface est
implicitement déclarée avec le modificateur abstract.
Toutes les méthodes d'une interface sont publiques et abstraites : elles
sont implicitement déclarées comme telles.
Une interface peut être d'accès public ou package. Si elle est publique,
toutes ses méthodes sont publiques même si elles ne sont pas déclarées
avec le modificateur public. Si elle est d'accès package, il s'agit d'une
interface d'implémentation pour les autres classes du package et ses
méthodes ont le même accès package : elles sont accessible à toutes les
classes du packages.
Les seules variables que l'on peut définir dans une interface sont des
variables de classe qui doivent être constantes : elles sont donc
implicitement déclarées avec le modificateur static et final même si
elles sont définies avec d'autres modificateurs.
Le mot clé static
Le mot clé static s'applique aux variables et aux méthodes. Les
variables d'instance sont des variables propres à un objet. Il est possible
de définir une variable de classe qui est partagée entre toutes les
instances d'une même classe : elle n'existe donc qu'une seule fois en
polymorphisme.
- Une interface s'implémente dans une classe en utilisant le mot clé
implements.
- Vous pouvez implémenter autant d'interfaces que vous voulez dans
vos classes.
- Vous devez redéfinir toutes les méthodes de l'interface (ou les
interfaces) dans votre classe.
Déclaration d'une interface :
[public] interface nomInterface [extends nomInterface1, nomInterface2
... ] {
// insérer ici des méthodes ou des champs static
}
Implémentation d'une interface :
Modificateurs class nomClasse [extends superClasse]
[implements nomInterface1, nomInterface 2, ...] {
//insérer ici des méthodes et des champs
}
Pour ajouter une nouvelle interface java, suivez la procédure suivante :
menu fichier\Nouveau Fichier puis sélectionner Java Interface. Enfin
cliquez le bouton suivant, dans l’écran suivant donnez le nom de
l’interface et cliquez le bouton terminer.
Exemple pratique
Nous créons deux interfaces :
1. Une interface pour salutation
package essaieinterface;
/**
*
* @author NGAINGAI
*/
44
}
public void saluer(){
System.out.println("Bonjour mes amis");
}
public String afficher(){
45
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Essaie test=new Essaie(" Alphee "); //Instanciation de la classe
salutaion sal=new Essaie();//polymorphisme
sal.saluer();//Avec cette référence, vous pouvez utiliser de façon
polymorphe les méthodes de l'interface salutaion
//test.saluer();
System.out.println(test.afficher());
}
I.1.11. Les accesseurs et les mutateurs
Un accesseur est une méthode qui va nous permettre d'accéder aux
46
public Ville(){
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHabitants = 0;
47
}
}
2. Ajoutons le constructeur avec paramètres
public class Ville {
//Stocke le nom de notre ville
String nomVille;
//Stocke le nom du pays de notre ville
String nomPays;
//Stocke le nombre d'habitants de notre ville
int nbreHabitants;
//Constructeur par défaut
public Ville(){
System.out.println("Création d'une ville !");
nomVille = "Inconnu";
nomPays = "Inconnu";
nbreHabitants = 0;
}
//Constructeur avec paramètres
//J'ai ajouté un « p » en première lettre des paramètres.
//Ce n'est pas une convention, mais ça peut être un bon moyen de
les repérer.
public Ville(String pNom, int pNbre, String pPays)
{
}
}
{
nomVille = pNom;
}
//Définit le nom du pays
public void setNomPays(String pPays)
49
{
nomPays = pPays;
}
//Définit le nombre d'habitants
public void setNombreHabitants(int nbre)
{
nbreHabitants = nbre;
}
}
4. À présent, testez ce code dans votre méthode main :
Ville v = new Ville();
Ville v1 = new Ville("Marseille", 123456, "France");
Ville v2 = new Ville("Rio", 321654, "Brésil");
//Affichage des villes
System.out.println("\n v = "+v.getNom()+" ville de
"+v.getNombreHabitants()+ " habitants se situant en "+v.getNomPays());
/*
Nous allons maintenant modifier leurs noms cette fois par le biais de
leurs mutateurs.
*/
v1.setNom("Hong Kong");
v2.setNom("Djibouti");
System.out.println(" v1 = "+v1.getNom()+" ville de
"+v1.getNombreHabitants()+ " habitants se situant en
"+v1.getNomPays());
System.out.println(" v2 = "+v2.getNom()+" ville de
"+v2.getNombreHabitants()+ " habitants se situant en
"+v2.getNomPays()+"\n\n");
Utilisation de la classe Scanner
50
A titre de rappel, pour que Java puisse lire ce que l‘utilisateur tape
au clavier, le programmeur peut utiliser la classe Scanner du package
Java.util. Comme ce package n‘est pas importé par défaut, le
programmeur doit d‘abord l‘importer (import Java.util.* ou import
Java.util.Scanner). Une fois que l‘importation a été faite, l‘utilisation
de cette classe se fait avec la syntaxe suivante :
1. Déclaration de la variable du type Scanner
Scanner nomduScanneur = new Scanner ( System .in);
2. Invitation de l’utilisateur à la saisie
System .out. println (" Message :"); //
3. Récuperer de l’information saisie et stockage dans la variable
La classe Scanner a plusieurs méthodes permettant de récuperer
l‘information saisie en fonction du type de la variable de stockage.
La méthode est de la forme
Next<Type de variable commençant par une majuscule>. Nous
pouvons en citer :
- nextInt() : récupérer les entiers
- nextFloat() : récupérer les réels
- nextLine() : récupérer les chaines de caractère
- …
La syntaxe de récupération de l‘information saisie est la suivante :
variable = nomduScanneur.Methode() ; //
Exemple suivant met en œuvre la méthode saisir dans la classe Etudiant:
package classeprincipale;
import java.time.Year;
/**
*
* @author NGAINGAI
*/
51
//les proprietes
String matricule;
String promotion;
String option;
/*Les méthodes
* **********************
*/
//1. méthode pour trouver le total de frais à payer
public int payer()
{
int tot = 0;
if (this.option.equals("Sciences commerciales"))
{
if (this.promotion.equals("G1") || this.promotion.equals("G2") ||
this.promotion.equals("G3"))
tot = 280;
else
tot = 380;
}
else
{
if (this.promotion.equals("G1") || this.promotion.equals("G2") ||
this.promotion.equals("G3"))
tot = 300;
else
52
tot = 400;
}
return tot;
}
//Constructeurs
public Etudiant(){
super.nom = "";
super.postnom = "";
super.adresse = "";
super.genre = "Masculin";
super.anneeNaiss =Year.now().getValue();
this.matricule = "";
this.promotion = "G1";
this.option = "Sciences commerciales";
}
public Etudiant(String pn, String psn,String pad, String pgr, int pan,
String mat, String prom, String opt){
super(pn,psn, pad, pgr, pan);
this.matricule = mat;
this.promotion = prom;
this.option = opt;
}
/*Les accesseurs et les mutateurs
*************************************
*/
//accesseur pour retourne le matricule
public String getMatricule(){ return this.matricule;}
//accesseur pour retourne le nom
53
***************************************
*/
@Override
public void afficher(){
System.out.println("-----------------AFFICHAGE DE L'ETUDIANT----------
----\nLe matricule est "+this.getMatricule()+"\nLe nom est
"+this.getNom()+"\nLe postnom est:"+this.getPostNom()+"\nVotre
adresse:"+this.getAdresse()+"\nVous etes du genre
"+this.getGenre()+"\nVous etes inscrit en:"+this.getPromotion()+"
"+this.getOption()+"\nL'annee est "+this.getAnneeNaissance()+" Donc
vous etes Age de "+super.calculAge(Year.now().getValue())+" ans\nVotre
montant total de frais a payer est de "+this.payer() +" $");
}
/*Methode pour effectuer la saisie de donnees
*********************************************
*/
public void saisir(){
Scanner sc=new Scanner(System.in),sci=new Scanner(System.in);
System.out.print("Entrez votre Matricule SVP: ");
this.matricule=sc.nextLine();
System.out.print("Entrez votre Nom SVP: ");
this.nom=sc.nextLine();
System.out.print("Entrez votre PostNom SVP: ");
this.postnom=sc.nextLine();
this.anneeNaiss=sci.nextInt();
System.out.print("Entrez votre Promotion SVP: ");
this.promotion=sc.nextLine();
System.out.print("Entrez votre Option SVP: ");
this.option=sc.nextLine();
}
}
L’instanciation dans la classe principale (cf. méthode main)
package classeprincipale;
/**
*
* @author NGAINGAI
*/
public class ClassePrincipale {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//Instanciation d'un etudiant
Etudiant unEtudiant=new Etudiant();
//saisie de donnees de l'etudiant
unEtudiant.saisir();
//affichage de l'etudiant
unEtudiant.afficher();
}
56
}
En résumé, nos accesseurs sont des méthodes, et sont public pour que
vous puissiez y accéder dans une autre classe que celle-ci (la classe
main, par exemple)
Les accesseurs sont du même type que la variable qu’ils doivent
retourner.
Les mutateurs sont, par contre, de type void. Ce mot clé signifie « rien
» ; en effet, ces méthodes ne retournent aucune valeur, elles se
contentent de les mettre en jour.
Exercice
Soit le programme permettant de calculer l’age de la personne et décide
de sa catégorie. Implémentez la classe en Java en appliquant les
concepts suivants : classe, propriétés, méthode, constructeurs,
accesseurs et mutateurs. Demandez les valeurs à l’utilisateur et afin
dans la classe principale instanciez cette classe aux constructeurs. La
catégorie est fonction de l’âge : de 0 à 5 ans : bébé, de 5 à 12 ans :
enfant, de 12 à 18 ans : adolescent, de 18 à 25 ans : Jeune, de 25 à 50
ans : adulte et de 50 ans et plus : vieux.
Eh…Oui ! Mettez la main à la charrue.
I.1.12. Les méthodes et variables de classe
1) Les méthodes de classe
Maintenant que vous commencez à écrire de vrais programmes,
vous vous rendez sûrement compte qu'il y a certaines choses que vous
length()
Celle-ci renvoie la longueur d'une chaîne de caractères (en comptant
les espaces).
String chaine = new String("coucou ! ");
int longueur = 0;
longueur = chaine.length(); //Renvoie 9
equals()
Cette méthode permet de vérifier (donc de tester) si deux chaînes de
caractères sont identiques. C'est avec cette fonction que vous
effectuerez vos tests de condition sur les String. Exemple concret:
String str1 = new String("coucou"), str2 = new String("toutou");
if (str1.equals(str2))
System.out.println("Les deux chaînes sont identiques !");
else
System.out.println("Les deux chaînes sont différentes !");
Vous pouvez aussi demander la vérification de l'inégalité grâce à
l'opérateur de négation... Vous vous en souvenez ? Il s'agit de «! ».
Cela nous donne :
String str1 = new String("coucou"), str2 = new String("toutou");
if (!str1.equals(str2))
System.out.println("Les deux chaînes sont différentes !");
else
System.out.println("Les deux chaînes sont identiques !");
Toutes ces méthodes sont très utiles, croyez-moi. Cependant, les plus
utiles sont encore celles que nous écrivons nous-mêmes !
C'est tellement mieux quand cela vient de nous...
Créer sa propre méthode
Les méthodes de classe permettent de gérer, éditer, afficher…faire
61
Avec nos objets Ville (cf. ex sur les accesseurs et mutateurs), notre choix
est un peu limité par le nombre de méthodes possibles, mais nous
pouvons tout de même en faire une ou deux pour l'exemple :
Faire un système de catégories de villes par rapport à leur nombre
d'habitants (<1000 → A, <10 000 → B…). Ceci est déterminé à la
construction ou à la redéfinition du nombre d'habitants : ajoutons
donc une variable d'instance de type char à notre classe et
appelons-la catégorie. Pensez à ajouter le traitement aux bons
endroits ;
faire une méthode de description de notre objet Ville ;
une méthode pour comparer deux objets par rapport à leur
nombre d'habitants.
Nous voulons que la classe Ville gère de façon de déterminer la catégorie
elle-même et non que cette action puisse être opérée de l’extérieur. La
méthode qui fera ceci sera donc déclarée private.
à this, et nous renvoie donc une chaîne de caractères qui nous décrit
l'objet en énumérant ses composants.
La méthode comparer(Ville V1)
Elle prend une ville en paramètre, pour pouvoir comparer les
variables nbreHabitants de l'objet appelant la méthode et de celui passé
65
deux cas, il faut aussi qu'elles soient static, car elles sont exécutées
dans un contexte static : la méthode main.
En résumé :
- Une classe permet de définir des objets. Ceux-ci ont des
attributs (variables d'instance) et des méthodes (méthodes
68
d’instance + accesseurs).
- Les objets permettent d'encapsuler du code et des données.
- Le ou les constructeurs d'une classe doivent porter le même nom
que la classe et n'ont pas de type de retour.
- L'ordre des paramètres passés dans le constructeur doit être
respecté.
- Il est recommandé de déclarer ses variables d'instance private,
pour les protéger d'une mauvaise utilisation par le programmeur.
- On crée des accesseurs et mutateurs (méthodes getters et
setters) pour permettre une modification sûre des variables
d'instance.
- Dans une classe, on accède aux variables de celle-ci grâce au mot
clé this.
- Une variable de classe est une variable devant être déclarée
static.
- Les méthodes n'utilisant que des variables de classe doivent elles
aussi être déclarées static.
- On instancie un nouvel objet grâce au mot clé new.
Exercices d’application :
1. Écrire en Java une classe nommé Produit qui est caractérisée par
le nom de l’article, le prix hors taxe de l’article, le nombre
d’articles et le taux de TVA. Les données sont demandées à
Une association est une relation entre deux classes (association binaire)
ou plus (association n-aire), qui décrit les connexions structurelles entres
leurs instances. Autrement dit, une association traduit une relation de
dépendance ou d’appartenance des objets des classes associées. Une
association est représentée par un trait continu liant les classes. Chaque
70
Nous allons commencer par découvrir comment créer des variables dans
la mémoire. Pour cela, il faut les déclarer.
Une déclaration de variable se fait comme ceci :
<Type de la variable> <Nom de la variable> ; Cette opération se termine
toujours par un point-virgule «;» (Comme toutes les instructions de ce
72
langage).
Ensuite, on l'initialise en entrant une valeur.
En Java, nous avons deux types de variables : des variables de type
simple ou « primitif » et des variables de type complexe ou des « objets
».
Ce qu'on appelle des types simples ou types primitifs, en Java, ce sont
tout bonnement des nombres entiers, des nombres réels, des booléens
ou encore des caractères, et vous allez voir qu'il y a plusieurs façons de
déclarer certains de ces types.
2. Les entrées/sorties
La classe Scanner
Je me doute qu'il vous tardait de pouvoir communiquer avec votre
application...
Le moment est enfin venu ! Mais je vous préviens, la méthode que je vais
vous donner présente des failles.
Pour que Java puisse lire ce que vous tapez au clavier, vous allez devoir
utiliser un objet de type Scanner. Cet objet peut prendre différents
paramètres, mais ici nous n'en utiliserons qu'un : celui qui correspond à
l'entrée standard en Java.
Lorsque vous faites System.out.println();, je vous rappelle que vous
appliquez la méthode println() sur la sortie standard ; ici, nous allons
utiliser l'entrée standard System.in.
Donc, avant d'indiquer à Java qu'il faut lire ce que nous allons taper au
clavier, nous devrons instancier un objet Scanner.
Avant de vous expliquer ceci, créez une nouvelle classe et tapez cette
ligne de code dans votre méthode main :
Scanner sc = new Scanner(System.in);
Vous devez avoir une jolie vague rouge sous le mot Scanner.
Cliquez sur la croix rouge sur la gauche et faites un double-clic sur « 73
En résumé
La lecture des entrées clavier se fait via l'objet Scanner.
Ce dernier se trouve dans le package java.util que vous devrez importer.
Pour pouvoir récupérer ce vous allez taper dans la console, vous devrez
initialiser l'objet Scanner avec l'entrée standard, System.in.
Il y a une méthode de récupération de données pour chaque type (sauf
les char) : nextLine() pour les String, nextInt() pour les int ...
3. Les conditions
75
Nous abordons ici l'une des sections les plus importantes : les
conditions sont une autre notion fondamentale de la programmation. En
effet, ce qui va être développé ici s'applique à énormément de langages
de programmation, et pas seulement à Java. Dans une classe, la lecture
et l'exécution se font de façon séquentielle, c'est-à-dire ligne par ligne.
Avec les conditions, nous allons pouvoir gérer différents cas de figure
sans pour autant lire tout le code. Vous vous rendrez vite compte que
tous vos projets ne sont que des enchaînements et des imbrications de
conditions et de boucles (notion que l'on abordera au chapitre suivant).
La structure if… else
Avant de pouvoir créer et évaluer des conditions, vous devez savoir
que pour y parvenir, nous allons utiliser ce qu'on appelle des « opérateurs
logiques ». Ceux-ci sont surtout utilisés lors de conditions (si [test] alors
[faire ceci]) pour évaluer différents cas possibles. Voici les différents
opérateurs à connaître :
« == » : permet de tester l'égalité.
Comme je vous l'ai dit dans le chapitre précédent, les opérations en Java
76
sont soumises à des priorités. Tous ces opérateurs se plient à cette règle,
de la même manière que les opérateurs arithmétiques… Imaginons un
programme qui demande à un utilisateur d'entrer un nombre entier
relatif (qui peut être soit négatif, soit nul, soit positif). Les structures
conditionnelles vont nous permettre de gérer ces trois cas de figure. La
structure de ces conditions ressemble à ça :
if(// condition )
// Exé cution des instructions si la condition est remplie
else
// Exé cution des instructions si la condition n'est pas Remplie
Cela peut se traduire par « si… sinon… ».
Le résultat de l'expression évaluée par l'instruction if sera un
boolean, donc soit true, soit false. La portion de code du bloc if ne sera
exécutée que si la condition est remplie. Dans le cas contraire, c'est le
bloc de l'instruction else qui le sera. Mettons notre petit exemple en
pratique :
int i = 10;
if (i < 0)
System.out.println("le nombre est négatif");
else
System.out.println("le nombre est positif");
Essayez ce petit code, et vous verrez comment il fonctionne. Dans ce
cas, notre classe affiche « le nombre est positif ». Expliquons un peu ce
qui se passe.
Maintenant que vous avez tout compris, je vais vous présenter une autre
façon d'écrire ce code, avec le même résultat : on ajoute juste un petit
« sinon si… ».
int i = 0;
if (i < 0)
78
int i = 58;
if(i < 100 && i > 50)
System.out.println("Le nombre est bien dans l'intervalle.");
Else
System.out.println("Le nombre n'est pas dans l'intervalle.");
Nous avons utilisé l'opérateur &&. La condition de notre if est devenue :
« si i est inférieur à 100 ET supérieur à 50 ». Avec l'opérateur « && », la
clause est remplie si et seulement si les conditions la constituant sont
toutes remplies ; si l'une des conditions n'est pas vérifiée, la clause sera
considérée comme fausse.
Cet opérateur vous initie à la notion d'intersection d'ensembles. Ici, nous
avons deux conditions qui définissent un ensemble chacune :
i < 100 définit l'ensemble des nombres inférieurs à 100 ;
20/20 : bravo !
Dans ce genre de cas, on utilise un Switch pour éviter des else if à
répétition et pour alléger un peu le code. Je vais vous montrer comment
se construit une instruction switch ; puis nous allons l'utiliser tout de
suite après.
Syntaxe
switch (/* Variable */)
{
case /* Argument */:
/* Action */;
break ;
default :
/* Action */;
}
Voici les opérations qu'effectue cette expression :
La classe évalue l'expression figurant après le switch (ici
/*Variable*/).
default :
System .out. println ("Il faut davantage travailler .");
}
Je n'ai écrit qu'une ligne de code par instruction case, mais rien ne vous
empêche d'en mettre plusieurs. Si vous avez essayé ce programme en
82
Un ternaire est une condition condensée qui fait deux choses sur une
seule ligne :
on teste la valeur d'une variable dans une condition ;
on affecte une valeur à une variable selon que la condition est vraie
ou non. Sur ce, on utilise l’opérateur ? 83
Vous pouvez également faire des calculs (par exemple) avant d'affecter
les valeurs :
int x = 10, y = 20;
code.
Il existe plusieurs sortes de structures conditionnelles :
la structure if... elseif... else ;
la structure switch... case... default ;
la structure ? :.
Si un bloc d'instructions contient plus d'une ligne, vous devez l'entourer
d'accolades afin de bien en délimiter le début et la fin.
Pour pouvoir mettre une condition en place, vous devez comparer des
variables à l'aide d'opérateurs logiques.
Vous pouvez mettre autant de comparaisons renvoyant un boolean que
vous le souhaitez dans une condition.
Pour la structure switch, pensez à mettre les instructions break; si vous
ne souhaitez exécuter qu'un seul bloc case.
4. Les structures itératives
Le rôle des boucles est de répéter un certain nombre de fois les
mêmes opérations. Tous les programmes, ou presque, ont besoin de ce
type de fonctionnalité. Nous utiliserons les boucles pour permettre à un
programme de recommencer depuis le début, pour attendre une action
précise de l'utilisateur, parcourir une série de données, etc. Une boucle
s'exécute tant qu'une condition est remplie. Nous réutiliserons donc des
notions de la section précédente !
1. La boucle while
Pour décortiquer précisément ce qui se passe dans une boucle, nous
allons voir comment elle se construit ! Une boucle commence par une
déclaration : ici while. Cela veut dire, à peu de chose près, « tant que
». Puis nous avons une condition : c'est elle qui permet à la boucle de
s'arrêter. Une boucle n'est utile que lorsque nous pouvons la contrôler,
et donc lui faire répéter une instruction un certain nombre de fois. C'est
à ça que servent les conditions. Ensuite nous avons une ou plusieurs
86
instructions : c'est ce que va répéter notre boucle (il peut même y avoir
des boucles dans une boucle !
while (/* Condition */)
{
// Instructions à répéter
}
Nous allons travailler sur un exemple concret mais d'abord, réfléchissons
à « comment notre boucle va travailler ». Pour cela, il faut déterminer
notre exemple. Nous allons afficher « Bonjour, <un prénom> », prénom
qu'il faudra taper au clavier ; puis nous demanderons si l'on veut
recommencer. Pour cela, il nous faut une variable qui va recevoir le
prénom, donc dont le type sera String, ainsi qu'une variable pour
récupérer la réponse. Et là, plusieurs choix s'offrent à nous : soit un
caractère, soit une chaîne de caractères, soit un entier. Ici, nous
prendrons une variable de type char. C'est parti !
// Une variable vide
String prenom ;
// On initialise celle -ci à O pour oui
char reponse = 'O';
// Notre objet Scanner , n'oubliez pas l'import de java . util .
Scanner !
Scanner sc = new Scanner ( System .in);
// Tant que la ré ponse donn ée est é gale à oui...
while ( reponse == 'O')
{
// On affiche une instruction
int a = 1, b = 15;
while (++a < b)
System.out.println("coucou " +a+ " fois !!");
Vous devez remarquer qu'il y a un tour de boucle en moins ! Eh bien avec
cette syntaxe, l'opérateur d'incrémentation est prioritaire sur l'opérateur
90
do{
System.out.println("Voulez-vous réessayer ? (O/N)");
reponse = sc.nextLine().charAt(0);
}while(reponse != 'O' && reponse != 'N');
}while (reponse == 'O');
System.out.println("Au revoir…");
Vous voyez donc que ce code ressemble beaucoup à celui utilisé avec la
boucle while, mais il comporte une petite subtilité : ici, plus besoin de
réinitialiser la variable reponse, puisque de toute manière, la boucle
s'exécutera au moins une fois !
3. La boucle for
Cette boucle est un peu particulière puisqu'elle prend tous ses
attributs dans sa condition et agit en conséquence. Je m'explique :
jusqu'ici, nous avions fait des boucles avec :
- déclaration d'une variable avant la boucle ;
- initialisation de cette variable ;
- incrémentation de celle-ci dans la boucle.
Eh bien on met tout ça dans la condition de la boucle for, et c'est tout.
Il existe une autre syntaxe pour la boucle for depuis le JDK 1.5. Nous la
verrons lorsque nous aborderons les tableaux. Mais je sais bien qu'un long
discours ne vaut pas un exemple, alors voici une boucle for sous vos yeux
ébahis :
for(int i = 1; i <= 10; i++)
{
boucle, c'est-à-dire qu'au lieu de partir de 0 pour aller à 10, nous allons
commencer à 10 pour atteindre 0 :
for(int i = 10; i >= 0; i--)
System.out.println("Il reste "+i+" ligne(s) à écrire");
Pour simplifier, la boucle for est un peu le condensé d'une boucle
while dont le nombre de tours se détermine via un incrément. Nous
avons un nombre de départ, une condition qui doit être remplie pour
exécuter une nouvelle fois la boucle et une instruction de fin de boucle
qui incrémente notre nombre de départ. Remarquez que rien ne nous
empêche de cumuler les déclarations, les conditions et les instructions
de fin de boucle :
for(int i = 0, j = 2; (i < 10 && j < 6); i++, j+=2){
System.out.println("i = " + i + ", j = " + j);
}
Ici, cette boucle n'effectuera que deux tours puisque la condition (i < 10
&& j < 6) est remplie dès le deuxième tour, la variable j commençant à
2 et étant incrémentée de deux à chaque tour de boucle.
En résumé
Les boucles vous permettent simplement d'effectuer des tâches
répétitives.
Il existe plusieurs sortes de boucles :
la boucle while(condition){…} évalue la condition puis exécute
éventuellement un tour de boucle (ou plus) ;
Tout comme les conditions, si une boucle contient plus d'une ligne
de code à exécuter, vous devez l'entourer d'accolades afin de bien
en délimiter le début et la fin.
Exercice d’application (utilisez la boucle au choix [for, while ou
do…while])
1. Ecrire un programme Java qui demande à l’utilisateur de lui fournir
la valeur d’un capital qu’il souhaite placer, ainsi que le taux
(mensuel) auquel sera effectué le placement. Il affiche l’évolution
mensuelle de ce capital jusqu’à ce qu’il ait atteint ou dépassé le
double du capital initial.
2. Réécrire le programme de dédoublement (1) du capital en y
ajoutant l’aspect de remboursement avant l’échéance. Cette
opération réduirait la valeur du capital placé. Toutefois, l’absence
du remboursement à l’échéance entraine l’évolution du capital au
triple.
5. Les tableaux
Comme tout langage de programmation qui se respecte, Java
travaille avec des tableaux. Vous verrez que ceux-ci s'avèrent bien
pratiques. Vous vous doutez (je suppose) que les tableaux dont nous
parlons n'ont pas grand-chose à voir avec ceux que vous connaissez ! En
programmation, un tableau n'est rien d'autre qu'une variable un peu
particulière. Nous allons en effet pouvoir lui affecter plusieurs valeurs
ordonnées séquentiellement que nous pourrons appeler au moyen d'un
indice (ou d'un compteur, si vous préférez). Il nous suffira d'introduire
de String, etc. Vous pouvez aussi déclarer un tableau vide, mais celui-ci
devra impérativement contenir un nombre de cases bien défini. Par
exemple, si vous voulez un tableau vide de six entiers :
int tableauEntier [] = new int[6];
// Ou encore
95
Vous avez dû remarquer la présence d'un i = 0; dans une boucle. Ceci est
primordial, sinon, lorsque vous reviendrez au début de celle-ci, i ne
vaudra plus 0, mais la dernière valeur à laquelle il aura été affecté après
les différentes incrémentations. Si vous faites une nouvelle recherche,
Ceci signifie qu'une erreur a été rencontrée, car vous avez essayé de lire
(ou d'écrire dans) une case qui n'a pas été définie dans votre tableau !
Voici un exemple (nous verrons les exceptions lorsque nous aborderons
la programmation orientée objet) :
String [] str = new String [10 ];
//L'instruction suivante va déclencher une exception
// Car vous essayez d'écrire à la case 11 de votre tableau
// Alors que celui -ci n'en contient que 10 (ça commence à 0 !) str [10]
= "Une exception ";
Nous allons maintenant travailler sur le tableau bidimensionnel
mentionné précédemment. Le principe est vraiment identique à celui
d'un tableau simple, sauf qu'ici, il y a deux compteurs. Nous allons
travailler sur un code permettant d'afficher les données par ligne, c'est-
à-dire l'intégralité du sous-tableau de nombres pairs, puis le sous-tableau
de nombres impairs.
Avec une boucle while
int premiersNombres[][] = { {0,2,4,6,8},{1,3,5,7,9} }, i = 0, j = 0;
while (i < 2)
{
j = 0;
while(j < 5)
{
System.out.print(premiersNombres[i][j]);
j++;
}
System.out.println("");
i++;
}
deuxième), et on initialise j à 0.
On entre ensuite dans la deuxième boucle, où j vaudra
successivement 0, 1, 2, 3 et 4 pour afficher le contenu du tableau
d'indice 0 (notre premier i).
On sort de cette boucle ; notre i est ensuite incrémenté et passe à
1.
On reprend le début de la première boucle : initialisation de j à 0.
On entre à nouveau dans la deuxième boucle, où le processus est
le même que précédemment (mais là, i vaut 1).
Enfin, nous sortons des boucles et le programme termine son
exécution.
Le même résultat avec une boucle for
int premiersNombres[][] = { {0,2,4,6,8},{1,3,5,7,9} };
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 5; j++)
{
System.out.print(premiersNombres[i][j]);
}
System.out.println("");
}
Je vous avais parlé d'une nouvelle syntaxe pour cette boucle, la voici :
String tab [] = {" Resultat ", " ali ", " masi", " tete ", " tonton "};
for ( String str : tab )
Java a une classe de base pour le traitement des erreurs. C’est la classe
Throwable Cette classe possède deux constructeurs : Throwable() et
Throwable(String). La chaine en paramètre permet de définir un
message qui décrit l'exception et qui pourra être consultée dans un bloc
catch. Les principales méthodes de la classe Throwable sont :
105
Méthodes Rôle
String getMessage( ) lecture du message
void printStackTrace( ) affiche l'exception et l'état de
la pile d'exécution au moment
de son appel
void printStackTrace(PrintStream s) Idem mais envoie le résultat
dans un flux
Illustration:
public class TestException {
public static void main(java.lang.String[] args) {
// Insert code to start the application here.
int i = 3;
int j = 0;
try {
System.out.println("résultat = " + (i / j));
}
catch (ArithmeticException e) {
System.out.println("getmessage");
System.out.println(e.getMessage());
System.out.println(" ");
System.out.println("toString");
System.out.println(e.toString());
System.out.println(" ");
System.out.println("printStackTrace");
e.printStackTrace();
}
}
}
Résultat :
106
getmessage
/ by zero
toString
java.lang.ArithmeticException: / by zero
printStackTrace
java.lang.ArithmeticException: / by zero
at tests.TestException.main(TestException.java:24)
2. Les exceptions personnalisées
}
}
5. Gestion des exceptions dans la méthode main du projet (1)
public class PersonneException {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Personne p=null;
try{
p=new Personne("",10);
System.out.println("Votre nom est "+p.getNom()+" Votre age est
"+p.getAge());
}
//Gestion Exception sur le nom
catch(NomPersonneException e)
{
e.printStackTrace();
}
//Gestion Exception sur l’age
catch(AgePersonneException e1){
System.out.println(e1.getMessage());
}
}
}
Je vous demande d’exécuter ces instructions et de constater les
résultats.
Exercice d’application
110
CHAPITRE II
LA PROGRAMMATION EVENEMENTIELLE
Par programmation événementielle on sous-entend
111
COMPOSANTS CLASSES
Fenêtre JFrame
Bouton JButton
Zone de texte JTextField
Zone de liste JList
Zone de liste JComboBox
deroulante
Bouton radio JRadioButton
Case à cocher JCheckBox
Conteneur JPanel
Menu JMenu
Barre de menu JMenuBar
Sous menu JMenuItem
Barre d’outils JToolBar
Boîte de dialogue JDialog
CREATION DE L’INTEFACE GRAPHIQUE
La création de l’interface graphique en Java peut se faire de deux
manières :
a) En utilisant la boite à outils fourni avec l‘IDE
b) En écrivant le code instanciant les composants.
A. Création de l’interface graphique en utilisant la boite à outils
fourni avec l’IDE
La première des choses à faire est de créer un projet de la manière
suivante :
Fichier\ Nouveau Projet\ java\ java Application.
Passez à l’écran suivant dans lequel vous indiquez le nom du projet et
éventuellement spécifier son emplacement et cliquez le bouton
« Terminer »
}
private void btnEffacerMouseClicked(java.awt.event.MouseEvent
evt) {
// TODO add your handling code here:
114
txtNom.setText("");
lblAfficher.setText("");
}
Le bouton effacer remet les contrôles à vide.
/**
*
* @author NGAINGAI
*/
public class MaFenetre {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
MaPremièreFenetre fen=new MaPremièreFenetre();
fen.setVisible(true);
}
}
Dans ce cours nous nous intéressons à la création des interfaces
graphiques en écrivant le code instanciant les composants.
B. Création de l’interface graphique en écrivant le code
instanciant les composants.
115
1) Le JFrame
Pour utiliser une fênetre de type JFame, vous devez instancier celui-ci.
Exemple
import javax.swing.JFrame;
public class Fenetre {
public static void main(String[] args) {
JFrame fen=new JFrame();
}
}
Vous pouvez aussi créer votre classe qui hérite de la classe JFrame du
package javax.swing :
public class MaPremièreFenetre extends javax.swing.JFrame {
}
Par contre, vous ne l’avez peut-être pas remarqué, mais, lorsque vous
cliquez sur le bouton de fermeture (pour fermer votre fenêtre), cette
action ne termine pas le processus !
Pour réellement terminer le processus de l’application, vous devrez
ajouter une autre instruction.
Pour chacune de ces choses énumérées, il y aura une méthode à appeler
pour que votre JFrame sache à quoi s’en tenir !
Voici un code qui reprend toutes ces doléances :
import javax.swing.JFrame;
public class Fenetre {
public static void main(String[] args) {
//Création de l'objet JFrame
JFrame fen=new JFrame();
//Définir un titre pour la fenêtre
fen.setTitle("Ma première fenêtre Java");
//Définir la taille de la fenêtre: 400px de large et 300px de
haut
fen.setSize(400, 300);
//Nous allons maintenant dire à notre objet de se
positionner au centre
fen.setLocationRelativeTo(null);
//Teminer le processus lorsqu'on clique sur "Fermer"
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Rendre la fenêtre visible
fen.setVisible(true);
}
}
Découvrez le résultat de vous-même.
sur votre écran. Les coordonnées, exprimées en pixels, sont basées sur
un repère prenant le coin supérieur gauche comme origine.
La première valeur de la méthode vous positionne sur l’axe X, 0
correspondant à l’origine ; les valeurs positives déplacent la fenêtre vers
la droite, et les valeurs négatives vous font sortir de l’écran vers la
gauche. La même règle s’applique pour les valeurs Y, excepté que les
valeurs positives font descendre la fenêtre en commençant par l’origine,
et les valeurs négatives font sortir la fenêtre par le haut !
Ex. fen.setLocation(200, 100);
EMPECHER LE REDIMENSIONNEMENT DE LA FENETRE
Pour empêcher le redimensionnement de la fenêtre, il vous suffit
d’invoquer la méthode setResizable(false) ; et de repasser la méthode
à true pour le rendre actif !
FAIRE QUE VOTRE FENETRE SOIT TOUJOURS AU PREMIER PLAN
Il s’agit là encore d’une méthode qui prend un booléen en paramètre.
Passer true mettre la fenêtre au premier plan quoi qu’il advienne, et
passer false annulera le statut. Cette méthode est
setAlwaysOnTop(boolean b).
RETIRER LES CONTOURS ET LES BOUTONS DE CONTROLES
Pour ce faire, il vous suffit d’utiliser la méthode
setUndercorated(boolean b).
CREER UN CONTENEUR POUR LA FENETRE
Nous allons utiliser un JPanel, composant de type conteneur, dont
la vocation est d’acceuillir d’autres objets de même type, ou des objets
pan.setBackground(Color.LIGHT_GRAY);
/*
* On prévient notre JFrame que ce sera notre JPanel qui
* sera son conteneur
*/ fen.setContentPane(pan);
119
//Ou encore
JLabel label2 = new JLabel("Mon deuxième JLabel");
La classe JLabel définit plusieurs méthodes pour modifier l'apparence du
composant :
Méthodes Rôle 120
setText() Permet d'initialiser ou de modifier le texte
affiché
setOpaque() Indique si le composant est transparent
(paramètre false) ou opaque (true)
setBackground() Indique la couleur de fond du composant
(setOpaque doit être à true)
setFont() Permet de préciser la police du texte
setForeGround() Permet de préciser la couleur du texte
setHorizontalAlignmen Permet de modifier l'alignement horizontal
t() du texte et de l'icône
setVerticalAlignment() Permet de modifier l'alignement vertical
du texte et de l'icône
setHorizontalTextAlign Permet de modifier l'alignement horizontal
ment() du texte uniquement
setVerticalTextAlignm Permet de modifier l'alignement vertical
ent() du texte uniquement
Exemple :
jLabel.setVerticalTextPosition(SwingConst
ants.TOP);
setIcon() Permet d'assigner une icône
setDisabledIcon() Permet d'assigner une icône dans un état
désactivée
//Définition d'une police d'écriture
Font police = new Font("Tahoma", Font.BOLD, 16);
//On l'applique au JLabel
label.setFont(police);
//Changement de la couleur du texte
label.setForeground(Color.blue);
//On modifie l'alignement du texte grâce aux attributs statiques
//de la classe JLabel
label.setHorizontalAlignment(JLabel.CENTER);
3) LE COMPOSANT JButton
L’objet JButton se trouve aussi dans le package javax.swing. Dans notre
classe, nous allons créer une variable d’instance de type JPanel et une
de type JButton
Code :
121
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
//importation de la classe pour le bouton
import javax.swing.JButton;
public class FenetreBouton {
public static void main(String[] args) {
JFrame fen=new JFrame();
fen.setTitle("Fenêtre avec bouton");
fen.setSize(400, 300);
fen.setLocationRelativeTo(null);
JPanel pan=new JPanel();
pan.setBackground(Color.LIGHT_GRAY);
//Création d'un bouton
JButton btn=new JButton();
//Ajout d'un nom au bouton
btn.setText("Bouton1");
//Ajout du bouton au contentPane
pan.add(btn);
fen.setContentPane(pan);
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setVisible(true);
}
}
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JPanel;
//importation de la classe pour le bouton
import javax.swing.JButton;
public class FenetreBouton {
public static void main(String[] args) {
JFrame fen=new JFrame();
fen.setTitle("Fenêtre avec bouton");
fen.setSize(400, 300);
fen.setLocationRelativeTo(null);
JPanel pan=new JPanel();
pan.setBackground(Color.LIGHT_GRAY);
//Création d'un bouton
JButton btn=new JButton();
//Ajout d'un nom au bouton
btn.setText("Bouton1");
//Couleur du bouton
btn.setBackground(Color.orange );
//Couleur de police du bouton
btn.setForeground(Color.RED);
//Dimension du bouton
btn.setPreferredSize(new Dimension(150,50));
//Police du bouton
btn.setFont(new Font("Arial",Font.BOLD,26));
//Rendre le bouton visible ou invisible
btn.setVisible(true);
//Activer ou Desactiver le bouton
btn.setEnabled(true);
123
btn.setText("Bouton1");
btn.setBackground(Color.orange );
btn.setForeground(Color.RED);
btn.setPreferredSize(new Dimension(150,50));
btn.setFont(new Font("Arial",Font.BOLD,26));
//Ajout des composants au contentPane
pan.add(lbl);
pan.add(btn);
fen.setContentPane(pan);
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setVisible(true);
//CLIC SUR LE BOUTON btn
//***********************
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
lbl.setText("Vous avez cliqué "+(nbre+1)+ " fois");
nbre++;
}
});
}
}
Remarque
/**
*
* @author NGAINGAI
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
//importation de la classe pour le conteneur
import javax.swing.JPanel;
/**
* @param args the command line arguments
*/
f.setSize(400, 300);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Contenaire
JPanel pan = new JPanel();
//Etiquette
JLabel lbl=new JLabel();
lbl.setText("Texte1:");
lbl.setPreferredSize(new Dimension(100,30));
lbl.setHorizontalAlignment(JLabel.LEFT);
//Création de la zone de texte
JTextField txt = new JTextField ();
//Dimension de la zone de texte
txt.setPreferredSize(new Dimension(200,30));
//Police du texte de la zone
txt.setFont(new Font("Arial",Font.ITALIC,14));
//Ajout des composants au contenaire
pan.add(lbl);
pan.add(txt);
f.getContentPane().add(pan);
f.setVisible(true);
}
}
Récupérer le contenu d’une zone de texte
/** 128
*
* @author NGAINGAI
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
//importation de la classe pour le conteneur
import javax.swing.JPanel;
/**
* @param args the command line arguments
*/
static JLabel lblResultat=new JLabel("");
static JLabel lblNbre1=new JLabel("Nombre 1");
static JLabel lblNbre2=new JLabel("Nombre 2");
static JTextField txtNbre1=new JTextField();
static JTextField txtNbre2=new JTextField();
public static void main(String[] args) {
// TODO code application logic here
//Fenêtre
JFrame fen=new JFrame();
fen.setTitle("Calculatrice minimale");
fen.setSize(350, 260);
fen.setLocationRelativeTo(null);
JPanel pan=new JPanel();
pan.setBackground(Color.LIGHT_GRAY);
//Dimension des Labels et des zones de texte
lblResultat.setPreferredSize(new Dimension(300,50));
lblNbre1.setPreferredSize(new Dimension(90,30));
lblNbre2.setPreferredSize(new Dimension(90,30));
txtNbre1.setPreferredSize(new Dimension(200,30));
129
txtNbre2.setPreferredSize(new Dimension(200,30));
lblResultat.setFont(new Font("Arial",Font.BOLD,26));
lblResultat.setHorizontalAlignment(JLabel.CENTER);
lblResultat.setBorder(BorderFactory.createLineBorder(Color.black));
//les Boutons
JButton btnPlus=new JButton("+");
btnPlus.setPreferredSize(new Dimension(70,30));
btnPlus.setFont(new Font("Arial",Font.BOLD,26));
JButton btnMoins=new JButton("-");
btnMoins.setPreferredSize(new Dimension(70,30));
btnMoins.setFont(new Font("Arial",Font.BOLD,26));
JButton btnMultiplication=new JButton("x");
btnMultiplication.setPreferredSize(new Dimension(70,30));
btnMultiplication.setFont(new Font("Arial",Font.BOLD,26));
JButton btnDivision=new JButton("/");
btnDivision.setPreferredSize(new Dimension(70,30));
btnDivision.setFont(new Font("Arial",Font.BOLD,26));
JButton btnEffacer=new JButton("Effacer");
btnEffacer.setPreferredSize(new Dimension(145,30));
btnEffacer.setFont(new Font("Arial",Font.ITALIC,26));
JButton btnQuitter=new JButton("Quitter");
btnQuitter.setPreferredSize(new Dimension(145,30));
btnQuitter.setFont(new Font("Arial",Font.ITALIC,26));
//Ajout des composants au contentPane
pan.add(lblResultat);
pan.add(lblNbre1);
pan.add(txtNbre1);
pan.add(lblNbre2);
pan.add(txtNbre2);
pan.add(btnPlus);
pan.add(btnMoins);
pan.add(btnMultiplication);
pan.add(btnDivision);
pan.add(btnEffacer);
pan.add(btnQuitter);
fen.setContentPane(pan);
130
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setVisible(true);
/*
* EVENEMENTS
* **********
*/
//CLIC SUR LE BOUTON btnPlus
//**************************
btnPlus.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
lblResultat.setText(String.valueOf((Double.valueOf(txtNbre1.getText()
)+(Double.valueOf(txtNbre2.getText())))));
}
});
//CLIC SUR LE BOUTON btnMoins
//***************************
btnMoins.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
lblResultat.setText(String.valueOf((Double.valueOf(txtNbre1.getText()
)-(Double.valueOf(txtNbre2.getText())))));
}
});
//CLIC SUR LE BOUTON btnMultiplication
//************************************
btnMultiplication.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
lblResultat.setText(String.valueOf((Double.valueOf(txtNbre1.getText()
)*(Double.valueOf(txtNbre2.getText())))));
}
});
//CLIC SUR LE BOUTON btnDivision
//******************************
btnDivision.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
131
lblResultat.setText(String.valueOf((Double.valueOf(txtNbre1.getText()
)/(Double.valueOf(txtNbre2.getText())))));
}
});
//CLIC SUR LE BOUTON btnEffacer
//*****************************
btnEffacer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
txtNbre1.setText("");
txtNbre2.setText("");
lblResultat.setText("");
}
});
//CLIC SUR LE BOUTON btnQuitter
//*****************************
btnQuitter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
System.exit(0);
}
});
}
}
Découvrez le résultat par vous-même.
5) LE COMPOSANT JList
Le composant JList (Zone de liste) permet de choisir une ou plusieurs
valeurs dans une liste prédéfinie.
package fen;
/**
*
* @author NGAINGAI
*/
import java.awt.Dimension;
import javax.swing.*;
132
}
Pour afficher la fenêtre, instanciez la classe dans le projet principal (cf.
méthode main)
package fen;
/**
*
* @author NGAINGAI
*/
6) LE COMPOSANT JComboBox
Le JComboBox (Zone de liste déroulante ou boîte de liste combinée)
associe un champ de texte et une boîte de liste à sélection simple. Tant
que le composant n'est pas sélectionné, seul le champ de texte s'affiche.
Lorsque l'utilisateur sélectionne le champ de texte, la boîte de liste
s'affiche. L'utilisateur peut choisir une valeur dans la boîte de liste qui
s'affiche alors dans le champ de texte.
package fen;
/**
*
* @author NGAINGAI
*/
import java.awt.Dimension;
import javax.swing.*;
public class Promotion extends JFrame {
public Promotion(){
this.setTitle("Zone de Liste");
this.setSize(280,230);
JPanel pn=new JPanel();
//Tableau des promotions
String[] promotion={"G1","G2","G3","L1","L2"};
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
Vous pouvez aussi utiliser la méthode addItem() pour ajouter les
éléments à la zone de liste déroulante:
JComboBox cbo=new JComboBox();
cbo.addItem("G1");
cbo.addItem("G2");
cbo.addItem("G3");
cbo.addItem("L1");
cbo.addItem("L2");
7) LE COMPOSANT JCheckBox (les cases à cocher)
La case à cocher de type JCheckBox permet à l’utilisateur d’effectuer
un ou plusieurs choix de type oui/non.
Exemple
package fen;
/**
*
* @author NGAINGAI
*/
import java.awt.Dimension;
import javax.swing.*;
public class Promotion extends JFrame {
public Promotion(){
this.setTitle("Choix");
this.setSize(280,230);
JPanel pn=new JPanel();
135
JCheckBox chk=new JCheckBox("Case à cocher");
pn.add(chk);
this.setContentPane(pn);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
NB:
Par défaut, une case à cocher est construite dans l’état non coché
(false).
La méthode isSelected de la classe AbstractButton permet de
connaître l’état (true ou false).
La méthode setSelected de la classe AbstractButton permet de
modifier l’état d’une case à cocher.
Exemple: MaCase.setSelected(true) ;
/**
*
* @author NGAINGAI
*/
import java.awt.Dimension;
136
import javax.swing.*;
public class Promotion extends JFrame {
public Promotion(){
JFrame fn=new JFrame();
fn.setTitle("Boutons radio");
fn.setSize(250, 200);
JPanel pn=new JPanel();
JRadioButton rb1=new JRadioButton("Radio 1");
JRadioButton rb2=new JRadioButton("Radio 2");
pn.add(rb1);
pn.add(rb2);
fn.setContentPane(pn);
fn.setVisible(true);
}
Vous pouvez voir que nos boutons radio ne répondent pas encore au
principe. Les deux boutons sont tous sélectionnés. Pour qu'un seul bouton
radio soit sélectionné à la fois, nous devons définir un groupe de boutons,
ButtonGroup. Dans celui-ci, nous ajouterons nos boutons radio et ainsi
seul un bouton sera sélectionné à la fois !
Code :
package fen;
/**
*
* @author NGAINGAI
*/
import java.awt.Dimension;
import javax.swing.*;
public class Promotion extends JFrame {
public Promotion(){
JFrame fn=new JFrame();
fn.setTitle("Boutons radio");
137
fn.setSize(250, 200);
JPanel pn=new JPanel();
JRadioButton rb1=new JRadioButton("Radio 1");
JRadioButton rb2=new JRadioButton("Radio 2");
pn.add(rb1);
pn.add(rb2);
//Groupe de boutons
ButtonGroup bg=new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
//Nous cochons rb1 par defaut
rb1.setSelected(true);
fn.setContentPane(pn);
fn.setVisible(true);
}
}
9) LE COMPOSANT JOptionPane (les boîtes de dialogue)
Une boîte de dialogue est une mini-fenêtre pouvant servir à plusieurs
choses :
afficher une information (message d'erreur, warning...) ;
demander une validation, une réfutation ou une annulation ;
demander à l'utilisateur de saisir une information dont le système
a besoin ;
...
Vous pouvez voir que ces dernières peuvent servir à beaucoup de choses.
Il faut toutefois les utiliser avec parcimonie : il est, au final, assez
package boitededialogue;
/**
*
* @author NGAINGAI
*/
import javax.swing.JOptionPane;
public class BoiteDeDialogue {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
//Déclaration des objets
JOptionPane jop1, jop2, jop3;
//Boîte du message d'information
//-------------------------------
jop1 = new JOptionPane();
jop1.showMessageDialog(null, "Message informatif", "Information",
JOptionPane.INFORMATION_MESSAGE);
}
Constatez le résultat par vous-même.
139
Ces trois boîtes ne s'affichent pas en même temps...
Pourquoi ça ? Tout simplement parce qu'en Java, mais aussi dans les
autres langages, les boîtes de dialogue sont dites modales. Ceci signifie
que lorsque qu'une boîte fait son apparition, celle-ci bloque toute
interaction possible avec un autre composant que ceux présents sur la
boîte. Ceci, tant que l'utilisateur n'a pas mis fin au dialogue !
Les types de boîtes
Voici les types de boîtes que vous pouvez utiliser :
JOptionPane.ERROR_MESSAGE
JOptionPane.INFORMATION_MESSAGE
JOptionPane.PLAIN_MESSAGE
JOptionPane.QUESTION_MESSAGE
JOptionPane.WARNING_MESSAGE
Les boîtes de confirmation
Comme leur nom l'indique, ces dernières permettent de valider,
de réfuter ou d'annuler une décision. Nous utiliserons toujours l'objet
JOptionPane mais, cette fois, avec la méthode showConfirmDialog() .
Cette méthode retourne un entier qui correspond à l'option que vous
aurez choisie dans cette boîte :
Yes ;
No ;
Cancel.
package boitededialogue;
/**
*
* @author NGAINGAI
*/
import javax.swing.JOptionPane;
public class BoiteDeDialogue {
140
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
JOptionPane jop = new JOptionPane();
int option = jop.showConfirmDialog(null, "Cliquez sur le bouton",
"Clic", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if(option==JOptionPane.YES_OPTION){
JOptionPane.showMessageDialog(null, "Vous avez cliqué sur
OK","Confirmation",JOptionPane.INFORMATION_MESSAGE);
}
if(option==JOptionPane.NO_OPTION){
JOptionPane.showMessageDialog(null, "Vous avez cliqué sur
Non","Confirmation",JOptionPane.INFORMATION_MESSAGE);
}
if(option==JOptionPane.CANCEL_OPTION){
JOptionPane.showMessageDialog(null, "Vous avez cliqué sur
Annuler","Confirmation",JOptionPane.INFORMATION_MESSAGE);
}
}
/**
*
* @author NGAINGAI
*/
import javax.swing.JOptionPane;
public class BoiteDeDialogue {
/**
141
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
JOptionPane jop = new JOptionPane(), jop2 = new JOptionPane();
String nom = jop.showInputDialog(null, "Veuillez saisir votre nom
!", "Nom", JOptionPane.QUESTION_MESSAGE);
jop2.showMessageDialog(null, "Votre nom est " + nom, "Identité",
JOptionPane.INFORMATION_MESSAGE);
}
}
Voyons comment on incorpore une liste dans une boîte de dialogue :
Exemple
Code :
package boitededialogue;
/**
*
* @author NGAINGAI
*/
import javax.swing.JOptionPane;
public class BoiteDeDialogue {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String[] sexe = {"masculin", "féminin"};
JOptionPane jop = new JOptionPane(), jop2 = new JOptionPane();
}
A vous de découvrir le résultat.
Exercices
Nous allons écrire un programme qui permettra d’afficher dans une boîte
de dialogue le nom de l’étudiant, son pourcentage et les cours qu’il doit
passer à la seconde session. Ces éléments sont sélectionnés à partir de
la fenêtre principale. Quand l’utilisateur clique sur le bouton afficher,
ils s’affichent alors dans la boîte de dialogue.
Code :
package enregistrement;
/**
*
* @author NGAINGAI
*/
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JCheckBox;
import javax.swing.BorderFactory;
import java.awt.Dimension;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Enregistrement {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
final JFrame fen=new JFrame();
143
fen.setTitle("Enregistrement");
fen.setSize(450, 450);
JPanel pan=new JPanel();
//LABEL
JLabel lblEtudiant=new JLabel("Etudiant");
lblEtudiant.setPreferredSize(new Dimension (70,30));
//COMBOBOX
final JComboBox cboEtudiant=new JComboBox();
cboEtudiant.setPreferredSize(new Dimension (200,30));
//AJOUT DES ELEMENTS DANS LE COMBOBOX
cboEtudiant.addItem("Mathe");
cboEtudiant.addItem("Germaine");
cboEtudiant.addItem("Lusenge");
cboEtudiant.addItem("Esperance");
cboEtudiant.addItem("Freddy");
//PANEL POUR LES POURCENTAGES
JPanel pourc=new JPanel();
pourc.setPreferredSize(new Dimension(380,90));
pourc.setBorder(BorderFactory.createTitledBorder("Pourcentage"));
//BOUTONS RADIO
final JRadioButton pourcMoins40;
final JRadioButton pourc40_50;
final JRadioButton pour50_70;
final JRadioButton pourc70_80;
final JRadioButton pourc80_90;
final JRadioButton pourcPlus90;
pourcMoins40=new JRadioButton("Moins de 40%");
pourc40_50=new JRadioButton("Entre 40 et 50%");
pour50_70=new JRadioButton("Entre 50 et 70%");
pourc70_80=new JRadioButton("Entre 70 et 80%");
crs3.setPreferredSize(new Dimension(300,30));
crs4.setPreferredSize(new Dimension(300,30));
crs5.setPreferredSize(new Dimension(300,30));
//AJOUT DES CASES A COCHER AU PANEL COURS
cours.add(crs1);
cours.add(crs2);
145
cours.add(crs3);
cours.add(crs4);
cours.add(crs5);
//BOUTONS
JButton btnAfficher=new JButton("Afficher");
JButton btnFermer=new JButton("Fermer");
JButton btnQuitter=new JButton("Quitter");
//AJOUT DU LABEL ET DU COMBOBOX AU CONTENAIRE PRINCIPAL
pan.add(lblEtudiant);
pan.add(cboEtudiant);
pan.add(pourc);
pan.add(cours);
pan.add(btnAfficher);
pan.add(btnFermer);
pan.add(btnQuitter);
fen.setContentPane(pan);
fen.setLocationRelativeTo(null);
fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fen.setVisible(true);
//AJOUT DE L'EVENEMENT AU BOUTON AFFICHER
btnAfficher.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
JOptionPane.showMessageDialog(null,"Etudiant: " +
cboEtudiant.getSelectedItem()+ "\n" + getPourcentage() + "\n" +
getCours());
}
public String getPourcentage()
{
String pourcentage ="";
if (pourcMoins40.isSelected()){
pourcentage="Pourcentage: " + pourcMoins40.getText();
}
if (pourc40_50.isSelected()){
pourcentage="Pourcentage: " + pourc40_50.getText();
}
if (pour50_70.isSelected()){
pourcentage="Pourcentage: " + pour50_70.getText();
146
}
if (pourc70_80.isSelected()){
pourcentage="Pourcentage: " + pourc70_80.getText();
}
if (pourc80_90.isSelected()){
pourcentage="Pourcentage: " + pourc80_90.getText();
}
if (pourcPlus90.isSelected()){
pourcentage="Pourcentage: " + pourcPlus90.getText();
}
return pourcentage;
}
public String getCours()
{
String crs="Cours:\n";
if(crs1.isSelected())
{
crs +=" - " + crs1.getText() + "\n";
}
if(crs2.isSelected())
{
crs +=" - " + crs2.getText() + "\n";
}
if(crs3.isSelected())
{
crs +=" - " + crs3.getText() + "\n";
}
if(crs4.isSelected())
{
crs +=" - " + crs4.getText() + "\n";
}
if(crs5.isSelected())
{
crs +=" - " + crs5.getText() + "\n";
}
return crs;
}
147
});
//AJOUT DE L'EVENEMENT AU BOUTON FERMER
btnFermer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
fen.dispose();
}
});
//AJOUT DE L'EVENEMENT AU BOUTON QUITTER
btnQuitter.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent argo){
System.exit(0);
}
});
}
}
10) Les menus
Une barre de menus située au sommet de la fenêtre contient les noms
des menus déroulants. Il suffit de cliquer dessus pour les ouvrir, ce qui
fait apparaître des options de menu et de sous-menus. Lorsque
l’utilisateur clique sur une option de menu, tous les menus sont fermés
et un message est envoyé au programme.
Le composant JMenuBar constitue le conteneur qui va accueillir les
menus représentés par des JMenu qui euxmêmes vont contenir des
éléments de menus représentés par des JMenuItem. Le composant
JMenuBar se comporte comme un conteneur pour les JMenu. Les JMenu
vont eux aussi se comporter comme un conteneur pour des JMenuItem
ou d’autres JMenu. La conception d’un menu va donc consister à créer
des instances de ces différentes classes puis de les associer les unes aux
autres. Au final le JMenuBar obtenu est placé sur son conteneur qui n’est
autre que la JFrame de l’application. Il faut bien sûr également penser
à traiter les événements déclenchés par ces différents éléments. En
général, seuls les JMenuItem sont associés à des écouteurs. Ils se
comportent comme des JButton. Ils ont d’ailleurs un ancêtre commun
148
}
};
Vous pouvez alors ajouter l’action au menu : JMenuItem exitItem =
fileMenu.add(exitAction);
Cette commande ajoute une option au menu, à l’aide du nom de
150
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.border.TitledBorder;
import java.awt.event.ActionEvent;
import java.awt.EventQueue;
import java.awt.event.*;
public class Enregistrement extends JFrame{
//Declaration des composants
private JComboBox cboPromotion;
private JLabel
lblNom,lblPostNom,lblPromotion,lblFaculte,lblFraisTot,lblDejaPayer,l
blSolde,lblTot,lblSold;
private JTextField txtNom,txtPostNom,txtDejaPayer;
private JRadioButton optM,optF;
private JCheckBox chkFrIns,chkFrLabo,chkFrBib;
private JList lstFaculte;
private JMenuBar menuBar = new JMenuBar();
private JMenu test1 = new JMenu("Fichier");
private JMenu test2 = new JMenu("Edition");
private JMenu ouvrir = new JMenu("Ouvrir");
private JMenuItem fermer = new JMenuItem("Quitter");
private JMenuItem calculatrice = new JMenuItem("Calculatrice");
private JMenuItem ouv2 = new JMenuItem("Etudiant");
public Enregistrement(){
//creation de la fenetre
this.setTitle("Gestion Etudiant");
//taille de la fenetre
this.setSize(400, 570);
152
String [] faculte={"Gestion
Informatique","Psychologie","Theologie","Agronomie","Education"};
lstFaculte=new JList(faculte);
chkFrIns=new JCheckBox("Frais Inscription");
chkFrLabo=new JCheckBox("Frais Laboratoire Inforamatique");
153
optM.setFont(polic);
optF.setFont(polic);
lstFaculte.setFont(polic);
JPanel panlbl=new JPanel(),pantxt=new JPanel(),panAutres=new
JPanel(),pansex=new JPanel(),panlst=new JPanel();
154
// pantitre.setPreferredSize(new Dimension(400,30));
panlbl.setPreferredSize(new Dimension(100,30));
pantxt.setPreferredSize(new Dimension(387,80));
pansex.setPreferredSize(new Dimension(387,50));
panAutres.setPreferredSize(new Dimension(1,30));
// pantitre.setBorder(BorderFactory.createLineBorder(Color.BLUE));
//pantitre.add(lblTitre);
panlbl.add(lblNom);
panlbl.add(txtNom);
panlbl.add(lblPostNom);
panlbl.add(txtPostNom);
pantxt.add(optM);
pantxt.add(optF);
panlst.add(lstFaculte);
//Groupe de boutons
ButtonGroup bg=new ButtonGroup();
bg.add(optM);
bg.add(optF);
bg.add(optM);
bg.add(optF);
optM.setSelected(true);
pantxt.setBorder(BorderFactory.createTitledBorder(null, "Sexe de
l'etudiant", TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, police, Color.BLUE));
// this.add("North", pantitre);
this.setContentPane(panlbl);
this.add("Center", pantxt);
this.add(panlst, rootPane);
this.add("East", panAutres);
155
calculatrice.setAction(ouvAction);
menuBar.setFont(polic);
//rendre visible
this.setVisible(true);
}
}
L'action attachée au JMenutItem « Fermer » permet de quitter
l'application.
Découvrez le résultat en exécutant le code.
Les raccourcis clavier
À nouveau, il est très simple d'insérer des raccourcis clavier. Pour
ajouter un « accélérateur » (raccourcis clavier des éléments de
menu) sur un JMenu, nous appellerons la méthode setAccelerator(); et
pour ajouter un mnémonique (raccourcis permettant de simuler le clic
sur un point de menu) sur un JMenuItem, nous nous servirons de la
méthode setMnemonic();.
Attribuons le mnémonique « F » au menu « Fichier » et le mnémonique
« E » pour le menu «Edition ». Vous allez voir, c'est très simple : il vous
suffit d'invoquer la méthode setMnemonic(char mnemonic); sur le JMenu
que vous désirez.
Ce qui nous donne, dans notre cas :
//mnemonic
//test1.setMnemonic('F');
test2.setMnemonic('E');
JMenuItem.
Pour ajouter des accélérateurs, c'est quasiment pareil, si ce n'est que
nous devrons utiliser un nouvel objet : KeyStroke.
Cet objet permet de déterminer la touche utilisée ou à utiliser. C'est
grâce à cet objet que nous allons pouvoir construire des combinaisons de
touches pour nos accélérateurs ! Nous allons commencer par attribuer
un simple caractère comme accélérateur à notre JMenuItem « Calculer
» en utilisant la méthode getKeyStroke(char caracter); de l'objet
KeyStroke.
(vous aurez besoin des packages javax.swing.KeyStroke et
java.awt.event.ActionEvent) :
//Cette instruction ajoute l'accélérateur 'c' à notre objet
Calculatrice.setAccelerator(KeyStroke.getKeyStroke('c'));
Testez votre application, un petit « c » est apparu à côté du menu «
Lancer ».
La figure suivante illustre le phénomène.
Appuyez sur la touche « c » de votre clavier : celle-ci a le même effet
qu'un clic sur le menu « Lancer » !
Attention : si vous mettez le caractère « C », vous serez obligés
d'appuyer simultanément sur SHIFT + c ou d'activer la touche MAJ !
Si le principe est bon, dites-vous aussi que maintenant, presser la touche
c lancera systématiquement votre animation !
C'est l'une des raisons pour laquelle les accélérateurs sont, en général,
des combinaisons de touches du genre CTRL + c ou encore CTRL + SHIFT
+ S.
Pour cela, nous allons utiliser une méthode getKeyStroke() un peu
différente : elle ne prendra pas le caractère de notre touche en
158
}
});
this.getContentPane().add(launch, BorderLayout.SOUTH);
t.start();
this.setVisible(true);
162
}
class Traitement implements Runnable{
public void run(){
launch.setEnabled(false);
for(int val = 0; val <= 500; val++){
bar.setValue(val);
try {
t.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
launch.setEnabled(true);
}
}
public static void main(String[] args){
Progress p = new Progress();
}
}
Exercices d’application
Réalisez de manière événementielle le diagramme de classe modélisant
la gestion du personnel (permanent et journalier) d’une entreprise X,
ainsi qu’une ébauche de code en Java y ajoutant soigneusement les
CHAPITRE III
JAVA ET LES BASES DE DONNEES
Dans ce chapitre, nous ferons nos premiers pas avec Java DataBase
Connectivity, communément appelé JDBC. Il s'agit en fait de classes
Java permettant de se connecter et d'interagir avec des bases de
données. Mais avant toute chose, il nous faut une base de données ! Nous
allons donc nous pencher sur l'utilité d'une base de données et verrons
comment en installer une que nous utiliserons afin d'illustrer la suite de
précis. Vous pouvez interroger votre base de données en lui donnant les
instructions suivantes :
« Donne-moi la fiche de la table Personne pour le nom Alphée»;
« Donne-moi la fiche de la table Pays pour le pays RDC» ;
etc.
165
Une base de données est une collection des fichiers dans lesquels sont
stockées des données relatives à un sujet donné. Ces fichiers sont
communément appelés tables. La création et la gestion d’une base de
données sont réalisées par un logiciel appelé SGBD (Système de Gestion
des Bases de Données). Selon les relations qui existent entre les tables
d’une base de données, on peut distinguer :
les bases de données relationnelles;
les bases de données hiérarchiques
etc.
A chaque type de base de données correspond un SGBD. Dans ce cours,
nous allons nous intéresser aux SGBD relationnelles. Il existe plusieurs
SGBD relationnelles dont nous citons : MS Access, MySQL, MS SQL Server,
Oracle, Dbase, PostgreSQL, … Chacune de ces bases de données possède
des spécificités : certaines sont payantes (Oracle), d'autres sont plutôt
permissives avec les données qu'elles contiennent (MySQL), d'autres
encore sont dotées d'un système de gestion très simple à utiliser
(MySQL), etc. C'est à vous de faire votre choix en regardant par exemple
sur Internet ce qu'en disent les utilisateurs. Pour cette partie traitant
des bases de données, mon choix s'est porté sur MySQL qui est gratuit et
complet.
Si vous voulez créer une application de gestion, vous aurez besoin de
deux logieciels :
Un langage de programmation à l’estar de C++, JAVA, Visual Basic,
PHP, C#, Python, Delphi, Mathab, F#, J#, …
168
/*Les méthodes
* ******************
*/
//1. methode pour calculer l'age
public int calculAge(int anneeEnCours)
{
return anneeEnCours - this.getDateNaissance().getYear();
}
//Constructeurs
public Personne() { }
public Personne(String n, String postn, String pren, String gr,
LocalDate daten,String nat)
{
this.nom = n;
this.postnom= postn;
this.prenom = pren;
this.dateNaiss = daten;
this.genre = gr;
170
this.nationalite = nat;
}
//Accesseurs
public String getNom()
{
// TODO: implement
return this.nom;
}
// TODO: implement
this.nom = sonNom;
}
}
2. Classe Etudiant
package basededonnees;
import java.time.LocalDate;
super.setGenre("Masculin");
super.setNationalite("");
}
public Etudiant(String n, String postn, String pren, String
gr,LocalDate daten,String nat,String mat,String inst,String sec,String
opt)
{
super(n,postn,pren,gr,daten,nat);
this.matricule = mat;
this.institutOrigine = inst;
this.sectionOrigine = sec;
this.optionOrigine = opt;
}
//accesseurs
public String getMatricule()
{
// TODO: implement
return this.matricule;
}
173
public String getSectionOrigine()
{
// TODO: implement
return this.sectionOrigine;
}
{
// TODO: implement
this.optionOrigine=optionOr;
}
}
174
Exercice :
Créez les autres classes pour compléter la couche métier.
import java.sql.*;
import javax.swing.*;
N.B : par défaut MySQL utilise le nom d‘utilisateur « root » et cela sans
mot de passe. Si vous en avez besoin, vous pouvez toujours le créer dans
PhpMyAdmin, privilège. Nous aurons besoin de cela pour la création de
175
Class.forName("com.mysql.jdbc.Driver");
//Etablir la connexion
con=DriverManager.getConnection("jdbc:mysql://localhost/ges_Inscrip
tion?user=root&password=");
}catch(ClassNotFoundException ex){
msgbox.showMessageDialog(null,ex.getMessage());
}catch(SQLException e){
msgbox.showMessageDialog(null, e.getMessage());
}return con;
}
}
2. Interface des opérations à réaliser sur l’étudiant
177
package basededonnees;
import java.util.List;
/**
*
* @author power tech
*/
public interface iOperation {
//Opérations sur l'inculpe
public void ajouter(Etudiant et);//pour enregistrer un étudiant
public void modifier(Etudiant et);//pour mise à jour des données d'un
étudiant
public void supprimer(Etudiant et);//pour supprimer un étudiant
public Etudiant rechercher(int matricule);//ppur rechercher un
étudiant
public List<Etudiant>ListerEtudiants(); //pour afficher la liste des
étudiants
}
3. Implémentation de l’interface
package basededonnees;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.ArrayList;
178
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
public class Implementation implements iOperation{
Connection connex = ConnexBD.meConnecter();
JOptionPane msg= new JOptionPane();
ResultSet result;
Statement sql;
@Override
public void ajouter(Etudiant et) {
try{
try (PreparedStatement ps = connex.prepareStatement("INSERT
INTO
Etudiant(matricule,nom,postnom,prenom,datenaissance,sexe,nationali
te,institutorigine,sectionorigine,optionorigine)
VALUES(?,?,?,?,?,?,?,?,?,?)")) {
ps.setString(1,et.getMatricule());
ps.setString(2, et.getNom());
ps.setString(3,et.getPostNom());
ps.setString(4, et.getPrenom());
ps.setDate(5, Date.valueOf(et.getDateNaissance()));
ps.setString(6, et.getGenre());
ps.setString(7, et.getNationalite());
ps.setString(8, et.getInstitutOrigine());
ps.setString(9, et.getSectionOrigine());
ps.setString(10, et.getOptionOrigine());
179
if (ps.executeUpdate()==1)
msg.showMessageDialog(null,"L'étudiant "+et.getNom()+"
"+et.getPostNom()+" "+et.getPrenom()+" est enregistré(e) avec
succès!");
else
msg.showMessageDialog(null,"Echec d'enregistrement",
"Echec", JOptionPane.WARNING_MESSAGE);
}
}catch(SQLException ex){
msg.showMessageDialog(null,ex.getMessage(),"Erreur",JOptionPane.ER
ROR_MESSAGE);
}
}
@Override
public void modifier(Etudiant et) {
try {
PreparedStatement ps = connex.prepareStatement("UPDATE
Etudiant SET
nom=?,postnom=?,prenom=?,datenaissance=?,sexe=?,nationalite=?,instit
utorigine=?,sectionorigine=?,optionorigine=? WHERE matricule=?");
ps.setString(10,et.getMatricule());
ps.setString(1, et.getNom());
ps.setString(2,et.getPostNom());
ps.setString(3, et.getPrenom());
ps.setDate(4, Date.valueOf(et.getDateNaissance()));
180
ps.setString(5, et.getGenre());
ps.setString(6, et.getNationalite());
ps.setString(7, et.getInstitutOrigine());
ps.setString(8, et.getSectionOrigine());
ps.setString(9, et.getOptionOrigine());
if (ps.executeUpdate()==1)
msg.showMessageDialog(null,"La modification est faite avec
succès!");
else
msg.showMessageDialog(null,"Echec de modification", "Echec",
JOptionPane.WARNING_MESSAGE);
ps.close();
} catch (SQLException ex) {
msg.showMessageDialog(null,ex.getMessage(),"Erreur",JOptionPane.ER
ROR_MESSAGE);
}
}
@Override
public void supprimer(Etudiant et) {
try{
PreparedStatement ps= connex.prepareStatement ("DELETE FROM
Etudiant WHERE matricule=?");
ps.setString(1,et.getMatricule() );
if (ps.executeUpdate()==1)
msg.showMessageDialog(null,"Suppression effectuée avec
succès!");
else
msg.showMessageDialog(null,"Echec de Suppression", "Echec",
181
JOptionPane.WARNING_MESSAGE);
ps.close();
}catch(SQLException ex){
msg.showMessageDialog(null,ex.getMessage(),"Erreur",JOptionPane.ER
ROR_MESSAGE);
}
}
@Override
public Etudiant rechercher(String matricule) {
Etudiant unEtudiant=null;
try{
PreparedStatement ps= connex.prepareStatement ("SELECT * FROM
Etudiant WHERE matricule=?");
ps.setString(1, matricule);
ResultSet rps = ps.executeQuery();
if (rps.next()){
unEtudiant=new Etudiant
(rps.getString("matricule"),
rps.getString("nom"),
rps.getString("postnom"),
rps.getString("prenom"),
rps.getDate("datenaissance").toLocalDate(),
rps.getString("sexe"),
rps.getString("nationalite"),
rps.getString("institutOrigine"),
rps.getString("sectionOrigine"),
rps.getString("optionOrigine")
182
);
}
ps.close();
}catch(SQLException ex){
msg.showMessageDialog(null,ex.getMessage(),"Erreur",JOptionPane.ER
ROR_MESSAGE);
}
if (unEtudiant==null) throw new RuntimeException
("L'étudiant dont le matricule est "+matricule+" n'existe
pas.\nVeuillez entrer un Numero matricule valide!");
return unEtudiant;
}
@Override
public List<Etudiant> ListerEtudiants() {
List<Etudiant> lesEtudiants =new ArrayList<Etudiant>();
try{
sql=connex.createStatement();
result=sql.executeQuery("SELECT * FROM Etudiant");
while(result.next()){
result.getString("nom"),
result.getString("postnom"),
result.getString("prenom"),
result.getDate("datenaissance").toLocalDate(),
result.getString("sexe"),
183
result.getString("nationalite"),
result.getString("institutOrigine"),
result.getString("sectionOrigine"),
result.getString("optionOrigine")
);
lesEtudiants.add(unEtudiant);
}
sql.close();
}catch(SQLException ex){
msg.showMessageDialog(null,ex.getMessage(),"Erreur",JOptionPane.ER
ROR_MESSAGE);
return lesEtudiants;
}
}
4. Instanciation et découverte personnelle des résultats
package basededonnees;
import java.time.LocalDate;
import java.util.List;
import javax.swing.JOptionPane;
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CEN
TER);
jLabel1.setText("IDENTIFICATION DES ETUDIANTS");
186
jLabel1.setBorder(javax.swing.BorderFactory.createLineBorder(n
ew java.awt.Color(0, 0, 0)));
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION, new
java.awt.Font("Tahoma", 1, 12))); // NOI18N
buttonGroup1.add(optM);
optM.setFont(new java.awt.Font("Tahoma", 1, 11)); //
NOI18N
optM.setText("Masculin");
optM.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent
evt) {
optMActionPerformed(evt);
}
});
buttonGroup1.add(optF);
optF.setFont(new java.awt.Font("Tahoma", 1, 12)); //
NOI18N
optF.setText("Feminin");
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig
nment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
188
.addContainerGap(103, Short.MAX_VALUE)
.addComponent(optM)
.addGap(18, 18, 18)
.addComponent(optF)
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alig
nment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.Group
Layout.Alignment.BASELINE)
.addComponent(optM)
.addComponent(optF))
.addContainerGap(18, Short.MAX_VALUE))
);
jLabel10.setText("Option d'origine");
jLabel11.setFont(new java.awt.Font("Tahoma", 1, 12)); //
NOI18N
jLabel11.setText("Age");
jLabel12.setFont(new java.awt.Font("Tahoma", 1, 12)); //
NOI18N
jLabel12.setText("Catégorie");
txtMatricule.setBorder(javax.swing.BorderFactory.createLineBor
der(new java.awt.Color(0, 0, 0)));
txtNom.setBorder(javax.swing.BorderFactory.createLineBorder(n
ew java.awt.Color(0, 0, 0)));
txtPostnom.setBorder(javax.swing.BorderFactory.createLineBord
er(new java.awt.Color(0, 0, 0)));
txtInstOr.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(0, 0, 0)));
txtNationalite.setBorder(javax.swing.BorderFactory.createLineB
order(new java.awt.Color(0, 0, 0)));
190
txtSecOr.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(0, 0, 0)));
txtOpOr.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(0, 0, 0)));
dtpDateNaissance.setBorder(javax.swing.BorderFactory.createLin
eBorder(new java.awt.Color(0, 0, 0)));
dtpDateNaissance.setFormatterFactory(new
javax.swing.text.DefaultFormatterFactory(new
javax.swing.text.DateFormatter(new
java.text.SimpleDateFormat("yyyy-MM-dd"))));
txtPrenom.setBorder(javax.swing.BorderFactory.createLineBorde
r(new java.awt.Color(0, 0, 0)));
lblAge.setHorizontalAlignment(javax.swing.SwingConstants.RIGH
T);
lblAge.setBorder(javax.swing.BorderFactory.createLineBorder(ne
w java.awt.Color(0, 0, 0)));
191
lblCateg.setHorizontalAlignment(javax.swing.SwingConstants.CE
NTER);
lblCateg.setBorder(javax.swing.BorderFactory.createLineBorder(
new java.awt.Color(0, 0, 0)));
btnAjouter.setText("Ajouter");
btnAjouter.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt)
{
btnAjouterMouseClicked(evt);
}
});
btnModifier.setText("Modifier");
btnModifier.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt)
{
btnModifierMouseClicked(evt);
}
});
btnSupprimer.setText("Supprimer");
btnSupprimer.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt)
{
192
btnSupprimerMouseClicked(evt);
}
});
btnRechercher.setText("Rechercher");
btnRechercher.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt)
{
btnRechercherMouseClicked(evt);
}
});
}
public void mouseExited(java.awt.event.MouseEvent evt)
{
txtRechercheMouseExited(evt);
}
193
});
jScrollPane2.setViewportView(dgEtudiant);
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addComponent(jLabel1,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.TRAILING, false)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING,
194
layout.createSequentialGroup()
.addComponent(jLabel2)
.addGap(85, 85, 85)
.addComponent(txtMatricule))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(txtPrenom,
javax.swing.GroupLayout.PREFERRED_SIZE, 144,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addComponent(jLabel3)
.addGap(114, 114, 114)
.addComponent(txtNom,
javax.swing.GroupLayout.PREFERRED_SIZE, 144,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
195
.addComponent(txtPostnom,
javax.swing.GroupLayout.PREFERRED_SIZE, 144,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.addComponent(dtpDateNaissance,
javax.swing.GroupLayout.PREFERRED_SIZE, 144,
javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(layout.createSequentialGroup()
.addGap(2, 2, 2)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING, false)
.addComponent(jLabel9)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addComponent(jLabel7)
.addComponent(jLabel8)
.addComponent(jLabel10))
.addGap(32, 32, 32)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
196
Alignment.LEADING, false)
.addComponent(txtNationalite)
.addComponent(txtInstOr)
.addComponent(txtSecOr)
.addComponent(txtOpOr,
javax.swing.GroupLayout.PREFERRED_SIZE, 146,
javax.swing.GroupLayout.PREFERRED_SIZE)))
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addGap(60, 60, 60)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.TRAILING)
.addComponent(jLabel12)
.addComponent(jLabel11))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addComponent(lblAge,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(lblCateg,
javax.swing.GroupLayout.DEFAULT_SIZE,
197
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(btnAjouter,
javax.swing.GroupLayout.PREFERRED_SIZE, 73,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addComponent(btnModifier,
javax.swing.GroupLayout.DEFAULT_SIZE, 93, Short.MAX_VALUE))
.addComponent(txtRecherche))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
198
Alignment.LEADING, false)
.addComponent(btnRechercher,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnSupprimer,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jScrollPane2,
javax.swing.GroupLayout.DEFAULT_SIZE, 555,
Short.MAX_VALUE))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.
LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1,
javax.swing.GroupLayout.PREFERRED_SIZE, 25,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
199
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(txtMatricule,
javax.swing.GroupLayout.PREFERRED_SIZE, 29,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2))
.addGap(7, 7, 7)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(txtNom,
javax.swing.GroupLayout.PREFERRED_SIZE, 25,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3))
.addGap(5, 5, 5)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addComponent(jLabel4)
.addComponent(txtPostnom,
javax.swing.GroupLayout.PREFERRED_SIZE, 24,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
200
Alignment.BASELINE)
.addComponent(txtPrenom,
javax.swing.GroupLayout.PREFERRED_SIZE, 24,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel5))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addComponent(jLabel6)
.addComponent(dtpDateNaissance,
javax.swing.GroupLayout.PREFERRED_SIZE, 25,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(jPanel1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(txtNationalite,
javax.swing.GroupLayout.PREFERRED_SIZE, 29,
201
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel7))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(txtInstOr,
javax.swing.GroupLayout.PREFERRED_SIZE, 21,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel8))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(jLabel9)
.addComponent(txtSecOr,
javax.swing.GroupLayout.PREFERRED_SIZE, 25,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
202
Alignment.BASELINE)
.addComponent(txtOpOr,
javax.swing.GroupLayout.PREFERRED_SIZE, 26,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel10))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(lblAge,
javax.swing.GroupLayout.PREFERRED_SIZE, 28,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel11)))
.addComponent(jScrollPane2,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
203
Alignment.BASELINE)
.addComponent(lblCateg,
javax.swing.GroupLayout.PREFERRED_SIZE, 26,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel12)))
.addGroup(layout.createSequentialGroup()
.addGap(39, 39, 39)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(btnAjouter)
.addComponent(btnModifier)
.addComponent(btnSupprimer))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement
.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.
Alignment.BASELINE)
.addComponent(btnRechercher)
.addComponent(txtRecherche,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE))
);
204
pack();
}// </editor-fold>
private void
formComponentShown(java.awt.event.ComponentEvent evt) {
// TODO add your handling code here:
//Appel de la méthode qui affiche la liste des étudiants dans
la grille de données
this.afficherGrille();
}
//Clic sur le bouton Ajouter
private void
btnAjouterMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try{
etud.setNom(txtNom.getText());
etud.setMatricule(txtMatricule.getText());
etud.setPostNom(txtPostnom.getText());
etud.setPrenom(txtPrenom.getText());
etud.setDateNaissance(LocalDate.parse(String.valueOf(dtpDateN
aissance.getText())));
if(optM.isSelected())
205
etud.setGenre(optM.getText());
else
etud.setGenre(optF.getText());
etud.setNationalite(txtNationalite.getText());
etud.setInstitutOrigine(txtInstOr.getText());
etud.setSectionOrigine(txtSecOr.getText());
etud.setOptionOrigine(txtOpOr.getText());
lblAge.setText(String.valueOf(etud.calculAge(LocalDate.now().ge
tYear()))+" Ans");
lblCateg.setText(String.valueOf(etud.trouverCategorie(etud.calc
ulAge(LocalDate.now().getYear()))));
metier.ajouter(new
Etudiant(etud.getNom(),etud.getPostNom(),etud.getPrenom(),et
ud.getGenre(),etud.getDateNaissance(),etud.getNationalite(),etu
d.getMatricule(),etud.getInstitutOrigine(),etud.getSectionOrigin
e(),etud.getOptionOrigine()));
this.afficherGrille();
}catch(Exception ex){
msg.showMessageDialog(null, ex.getMessage());
}
}
private void
txtRechercheMouseEntered(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
206
private void
txtRechercheMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(!txtRecherche.getText().equals(""))
txtRecherche.setText("");
}
private void
txtRechercheMouseExited(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(txtRecherche.getText().equals(""))
txtRecherche.setText("Tapez ici le Matricule...");
}
//CLIC SUR LE BOUTON RECHERCHER
private void
btnRechercherMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try{
etud=metier.rechercher(txtRecherche.getText());
txtNom.setText(etud.getNom());
txtMatricule.setText(etud.getMatricule());
txtPostnom.setText(etud.getPostNom());
txtPrenom.setText(etud.getPrenom());
dtpDateNaissance.setText(String.valueOf(etud.getDateNaissance(
)));
if(etud.getGenre().equals(optM.getText()))
207
optM.setSelected(true);
else
optM.setSelected(true);
txtNationalite.setText(etud.getNationalite());
txtInstOr.setText(etud.getInstitutOrigine());
txtSecOr.setText(etud.getSectionOrigine());
txtOpOr.setText(etud.getOptionOrigine());
lblAge.setText(String.valueOf(etud.calculAge(LocalDate.now().ge
tYear()))+" Ans");
lblCateg.setText(String.valueOf(etud.trouverCategorie(etud.calc
ulAge(LocalDate.now().getYear()))));
}catch(Exception ex){
msg.showMessageDialog(null, ex.getMessage());
}
}
//CLIC SUR LE BOUTON SUPPRIMER
private void
btnSupprimerMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try{
int rps=msg.showConfirmDialog
(null,"Voulez-vous vraiment supprimer
"+metier.rechercher(mat).getNom()+"
"+metier.rechercher(mat).getPostNom()+" ?",
"Confirmer",JOptionPane.YES_NO_OPTION);
if(rps==JOptionPane.YES_OPTION){
metier.supprimer(etud);
this.afficherGrille();
}
}
}catch(Exception ex){
msg.showMessageDialog(null, ex.getMessage());
}
}
//CLIC SUR LE BOUTON MODIFIER
private void
btnModifierMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try{
etud.setNom(txtNom.getText());
etud.setMatricule(txtMatricule.getText());
etud.setPostNom(txtPostnom.getText());
etud.setPrenom(txtPrenom.getText());
etud.setDateNaissance((LocalDate)
dtpDateNaissance.getValue());
if(optM.isSelected())
etud.setGenre(optM.getText());
else
209
etud.setGenre(optF.getText());
etud.setNationalite(txtNationalite.getText());
etud.setInstitutOrigine(txtInstOr.getText());
etud.setSectionOrigine(txtSecOr.getText());
etud.setOptionOrigine(txtOpOr.getText());
lblAge.setText(String.valueOf(etud.calculAge(LocalDate.now().ge
tYear()))+" Ans");
lblCateg.setText(String.valueOf(etud.trouverCategorie(etud.calc
ulAge(LocalDate.now().getYear()))));
metier.modifier(new
Etudiant(etud.getNom(),etud.getPostNom(),etud.getPrenom(),et
ud.getGenre(),etud.getDateNaissance(),etud.getNationalite(),etu
d.getMatricule(),etud.getInstitutOrigine(),etud.getSectionOrigin
e(),etud.getOptionOrigine()));
this.afficherGrille();
}catch(Exception ex){
msg.showMessageDialog(null, ex.getMessage());
}
}
//Méthode qui affiche la liste des étudiants dans la grille de
données
public void afficherGrille(){
List<Etudiant>liste=metier.ListerEtudiants();
dgEtudiant.setModel(new
javax.swing.table.DefaultTableModel(new String[]{ "Matricule",
"Nom", "Postnom", "Prenom", "Date de naissance", "Genre",
"Nationalite", "Institut d'origine", "Section d'origine", "Option
210
d'origine"}, liste.size()));
for(int i=0; i<liste.size();i++){
dgEtudiant.setValueAt(liste.get(i).getMatricule(), i,
0);
dgEtudiant.setValueAt((liste.get(i).getNom()), i, 1);
dgEtudiant.setValueAt(liste.get(i).getPostNom(), i, 2);
dgEtudiant.setValueAt(liste.get(i).getPrenom(), i,3);
dgEtudiant.setValueAt(liste.get(i).getDateNaissance(),
i, 4);
dgEtudiant.setValueAt(liste.get(i).getGenre(), i, 5);
dgEtudiant.setValueAt(liste.get(i).getNationalite(), i,
6);
dgEtudiant.setValueAt(liste.get(i).getInstitutOrigine(),
i, 7);
dgEtudiant.setValueAt(liste.get(i).getSectionOrigine(),
i, 8);
dgEtudiant.setValueAt(liste.get(i).getOptionOrigine(),
i, 9);
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(frmEtudiant.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(frmEtudiant.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(frmEtudiant.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
212
java.util.logging.Logger.getLogger(frmEtudiant.class.getName())
.log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>