Introduction à la programmation visuelle et l’exploitation des données SLPack 0.4.5

afternoonhandsomelyΛογισμικό & κατασκευή λογ/κού

17 Νοε 2012 (πριν από 4 χρόνια και 7 μήνες)

407 εμφανίσεις



Département Informatique





Programmation en Java



Introduction à la programmation visuelle et
l’exploitation des données

SLPack 0.4
.5



par Louis SWINNEN

dernière révision

: 2
9
/0
3
/
1
1







Ce document est disponible sous licence Creative Commons in
diquant qu’il peut être
reproduit, distribué et communiqué pour autant que le nom de l’auteur reste présent,
qu’aucune utilisation commerciale ne soit faite à partir de celui
-
ci et que le document ne soit
ni modifié, ni transformé, ni adapté.



http://creativecommons.org/licenses/by
-
nc
-
nd/2.0/be/








La Haute Ecole Libre Mosane (HELMo) attache une grande importance au respect des droits d’auteur.

C’est la raison pour laquelle nous i
nvitons les auteurs dont une oeuvre aurait été, malgré tous nos

e
fforts, reproduite sans autorisation suffisante, à contacter immédiatement le service juridique de la
H
aute Ecole afin de pouvoir régulariser la situation au mieux.






Mars 2009

© L. Swinnen, 2010


2

Programma
tion en Java

Introduction à la programmation visuelle et l’exploitation des
données

par Louis SWINNEN


1. Introduction

Ce document a pour but d’introduire à la programmation d’interface visuelle simple au
moyen du langage Java. Pour ce faire, il est nécess
aire de disposer du composant
SLPack
.
Ce document décrit la version
0.4
.5

de ce composant. La dernière version de ce composant
et la documentation l’accompagnant sont disponibles sur le site internet

:

http://www.swila.b
e


1.1
SLPack
, de quoi s’agit
-
il

?

SLPack

est un composant développé pour simplifier la programmation d’interface visuelle. Ce
composant
est développé dans un but pédagogique uniquement

: rendre la
programmation d’interface visuelle ainsi que l’exploitati
on des bases de données
en Java accessibles aux débutants.


Lorsque l’étudiant étudiera, de manière approfondie, le langage Java, l’utilisation de ce
composant ne sera plus nécessaire.


Si vous souhaitez partager votre expérience avec ce composant (signal
er un problème,
demander une modification quelconque), il suffit de vous rendre sur la page du projet, sur le
site internet suivant

:

http://www.swila.be



Seule la version «

compilée

» est disponible sous forme de libr
airie indépendante (un fichier
Jar
). Ce composant est compatible
avec la version 5.0 ou supérieur

de Java.


1.2 Installation de SLPack

La procédure d’installation consiste à placer le composant
SLPack

dans un dossier de votre
choix et ensuite de référencer

celui
-
ci. Le composant
SLPack

prend la forme de fichiers
Jar

(c’est
-
à
-
dire des classes compilées et directement utilisables).


Dans votre environnement de développement (par exemple sous NetBeans, Eclipse ou
IntelliJ), il faut indiquer, dans votre proje
t, le lien vers le composant
SLPack

à utiliser.



Par exemple dans
NetBeans
, il faut ajouter les fichiers JAR dans votre projet. Pour
ce faire, dans la section
Libraries

(panneau de gauche), faire un clic
-
droit et choisir
Add Jar/Folders

et sélectionner les

fichiers JAR nécessaires à votre application.




Sous
Eclipse
, il est possible lors de la création du projet Java d’indiquer des libraires
particulières. Ainsi dans la fenêtre
Java Settings
, choisir l’onglet
Libraries
et ensuite
Add External JARs

et sélect
ionner les fichiers JAR. Si le projet est déjà créé, il est
possible d’ajouter les libraires en faisant un clic
-
droit sur le nom du projet et en
choisissant Properties. Ensuite, l’option
Java Build Path

fait apparaître une série
© L. Swinnen, 2010


3

d’onglets. Choisir dans l’o
nglet
Librairies

l’option
Add External JARs
et sélectionner les
fichiers JARs à intégrer.




Sous
IntelliJ
, il faut ajouter également le composant
SLPack
. Pour ce faire, dans le
projet (panneau de gauche), faire un clic
-
droit sur
Libraries

et choisir
Jump To

Source
. Les paramètres du projet sont alors affichés, choisir dans la section
Librairies
,
l’icône + au sommet. Ensuite, il faut donner un nom à ces librairies, comme par
exemple
SLPack

et enfin, dans le panneau de droite, choisir l’option
Attach Classes

e
t
choisir les librairies à ajouter.


En dehors de l’environnement de développement, il faut modifier la variable d’environnement
CLASSPATH afin que celle
-
ci pointe vers les fichiers JAR. Ainsi, sous Windows, il faut
effectuer les étapes suivantes (en admin
istrateur)

:



Sous Windows XP

:

Clic
-
droit sur le
poste de travail
, choisir
Propriétés

puis l’onglet
Avancé

et cliquer sur
Variable
s

d’environnement
.


Sous Windows Vista/7

:

Clic
-
droit sur
Ordinateur

puis choisir
Propriétés

puis, dans
les tâches qui apparai
ssent à gauche, choisir
Paramètres système avancés

et ensuite
cliquer sur
Variables d’environnement
.




Dans la section
Variables système
, localiser la variable
PATH

(qui indique le chemin
de recherche par défaut) et
modifiez

celle
-
ci pour ajouter le chemin

vers les fichiers
systèmes Java. Ainsi, si votre compilateur Java est installé dans C:
\
Program
Files
\
Java
\
jdk1.6.0_06, ajoutez ceci à la fin de la valeur existante

:


;C:
\
Program Files
\
Java
\
jdk1.6.0_06
\
bin





Egalement dans la section
Variables système
, vé
rifiez si la variable
CLASSPATH

est
définie. Si ce n’est pas le cas, il faut créer une nouvelle variable, sinon modifier la
variable existante. Il faut ici ajouter le chemin vers le composant
SLPack

installé sur
votre machine. Si, comme à l’école, le compo
sant est installé dans un répertoire
SLPack dans le dossier Program Files,

la variable
CLASSPATH

doit contenir
notamment le chemin suivant

:

C:
\
Program Files
\
SLPack
\
slpack.jar


Sous les systèmes basés Unix, il faut réaliser les mêmes modifications. Par exe
mple,
sous
Linux
, si vous avez installé le compilateur Java et le composant
SLPack

dans le répertoire
/opt
, vous devez adapter la variable
PATH

et
CLASSPATH

comme sous Windows.


Le plus simple est d’ajouter le fichier suivant dans le répertoire
/etc/profil
e.d

:

Fichier

/etc/profile.d/java.sh

#! /bin/bash


JAVA_HOME=/opt/jdk1.6.0_06

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=$CLASSPATH:/opt/SLPack/slpack.jar

export JAVA_HOME PATH CLASSPATH


Il reste ensuite à rendre ce script exécutable soit en ajoutant la permis
sion
execute

par
l’interface graphique, ou en entrant dans un terminal la commande suivante

:

chmod +x /etc/profile.d/java.sh


Une fois cette modification effectuée, il suffit de redémarrer la machine et l’environnement
Java est prêt à être utilisé.


© L. Swinnen, 2010


4

1.3
Installation des librairies externes

Depuis la version
0.4

de SLPack, un nouveau composant simplifié d’accès aux bases de
données SQL Server et Oracle est proposé. Cependant, afin que celui
-
ci fonctionne, il est
nécessaire de disposer des drivers JDBC adéq
uats fournis par Oracle et Microsoft.


Pour des raisons de copyright, ces drivers JDBC ne peuvent être fournis directement avec
SLPack mais doivent être téléchargé par l’utilisateur et intégré à l’environnement de
développement. Voici les composants à télé
charger

:



Pilote JDBC 2.0 Microsoft SQL Server

:

http://www.microsoft.com/downloads/details.aspx?familyid=99B21B65
-
E98F
-
4A61
-
B811
-
1
9912601FDC9&displaylang=fr




Pilote JDBC Oracle Express Edition (XE)


2 fichiers

:

http://download.oracle.com/otn/utilities_drivers/jdbc/10204/ojdbc14.jar

http://download.oracle.com/otn/utilities_drivers/jdbc/10204/orai18n.jar


Une fois ces drivers téléchargés, il faut les inclure dans l’environnement de développement.
La procédure

est identique à celle vue précédemment pour inclure la bibliothèque SLPack. En
effet, tous ces drivers JDBC sont des librairies JAR.


A titre d’information, tous les drivers JDBC sont installés sur les ordinateurs de l’école dans le
répertoire
C:
\
Program
Files
\
JDBC
. Il suffit de localiser les fichiers JAR et les inclure dans
le projet pour pourvoir établir une connexion vers la base de données.


Si la librairie est mal installée, la connexion à la base de données échouera avec un message
du type «

Error wh
ile loading the JDBC Driver (driver not found, not in classpath, …)

». Il
convient dans ce cas de vérifier à nouveau la configuration afin d’être sûr que les drivers
sont bien présents.


Il n’y a aucune objection à installer l’ensemble des librairies dans

le même répertoire. Ainsi,
il est possible de rassembler les fichiers suivants

:



SLPack.jar



librairie SLPack



ojdbc14.jar

et
orai18n.jar



Pilote JDBC de Oracle



sqljdbc4.jar



Pilote JDBC de Microsoft SQL Server


© L. Swinnen, 2010


5

2. Utilisation de SLPack

Nous allons mai
ntenant détailler l’utilisation de
SLPack
. Nous verrons

:



La structure de base d’un programme
SLPack



Les différents composants graphiques disponibles



La gestion des évènements



Les différentes «

fonctions

» (on parle plutôt de
méthodes

dans les langages
ori
entés
-
objets) disponibles


Ce document
ne montrera pas

comment
SLPack
a été créé, bien que cela ne soit pas bien
compliqué. En guise d’application, les étudiants plus avancés en Java peuvent se risquer à
cet exercice.


2.1 Structure d’un programme
SLPack

C
omme il s’agit d’un programme
Java
, il faut respecter les règles inhérentes au langage
Java. Celles
-
ci ne seront pas détaillées dans ce document. Reportez
-
vous à vos notes
concernant Java en cas de doute. Vous pouvez également trouver beaucoup d’éléments d
ans
l’excellent livre
Thinking in Java [1]
1

ou encore dans les livres de référence
Core Java [2] [3]
.


Le squelette du programme
SLPack

sera
au moins

le suivant

:

import

SLPack.SLForm;


public class

MonProgramme

extends

SLForm {


public static void

main
(String [] args) {



MonProgramme

p =
new

MonProgramme
();


}



public

MonProgramme
() {


// insérer le code source ici



}



public void

action(String id) {


// insérer la gestion des événements ici


}

}

Code 1

:

Squelette mi
nimal d’un programme
SLPack




Attention

!

Le langage
Java

impose que
le nom de votre fichier Java
soit identique

au nom de la classe
. Ainsi, pour le squelette proposé (voir code 1), le fichier doit porter le
nom
MonProgramme.java
.


Si vous souhaitez chan
ger le nom de votre fichier, assurez vous de modifier votre code
source Java en conséquence. Ainsi, si je souhaite que mon fichier se nomme Exervice1.java,
il convient de changer tous les noms
MonProgramme

(en rouge dans code 1) en Exercice1.


Dans le sque
lette minimal, on trouve les éléments suivants

:

1.

La clause
import

qui assure que le composant
SLPack

est inséré.


2.

La définition de la classe qui contiendra le programme principal. Comme indiqué ci
-
dessus, il faut que le nom de la classe et le nom du fichie
r source
java




1

Les éléments entre crochets sont des références à la bibliographie

© L. Swinnen, 2010


6

correspondent. La définition de la classe contient le mot clé
extends

indiquant qu’elle
hérite du composant
SLForm
.

Le composant
SLForm

représente une fenêtre graphique. Nous en reparlerons plus
tard.


3.

La méthode (ou fonction)
main

qui sera e
xécutée lorsque nous lancerons cette
application. Cette méthode
main

standard crée un objet. Aucune modification ne doit
être faite ici.


4.

La méthode
MonProgramme

(le nom doit être celui du fichier Java et celui présent
dans la méthode
main
) contiendra le c
ode à exécuter, comme l’indique le
commentaire.


5.

La méthode (ou fonction)
action

est appelée automatiquement lorsque l’utilisateur
clique sur un composant visuel bouton. Elle est obligatoire dans tous vos programmes
SLPack
.



2.2 Premier programme SLPack

Dans notre premier programme, nous allons calculer l’aire et le périmètre d’un rectangle.
Voici la fenêtre que nous souhaitons obtenir

:



Fenêtre 1

:

Application PremierExemple



Cette fenêtre contient de 3 types de composants graphiques

:



des
labels

:

des zones textes non modifiables par l’utilisateur



des
textfields

: des champs de saisie



des
buttons

:
des boutons permettant de déclencher des actions.


Le bouton
calculer

doit permettre de calculer l’aire et le périmètre en fonction des longueurs
et lar
geurs introduites par l’utilisateur. L’utilisateur doit pouvoir effectuer autant d’essais qu’il
le souhaite, simplement en modifiant les champs
longueur
et
largeur

et en cliquant à
nouveau sur le bouton
calculer
.


Le bouton
quitter

doit permettre de quitte
r l’application. Il faut également qu’un clic sur la
croix en haut à droite (sous Microsoft Windows) provoque la fin du programme.


Nous allons maintenant détailler le code et ensuite, partant de celui
-
ci, expliquer les concepts
et possibilités de
SLPack
.


© L. Swinnen, 2010


7

import

SLPack.SLForm;


public class

PremierExemple
extends

SLForm {


public static void

main(String [] args) {


PremierExemple pe =
new

PremierExemple();


}



public

PremierExemple() {


// insérer le code source ici


setDimension
(3,4,80);



setTitle
("Aire rectangle");


addLabel
("lbLongueur", "Longueur:", 0, 0);


addTextField
("tfLongueur", "", 0, 1);


addLabel
("lbLargeur", "Largeur:", 1, 0);


addTextField
("tfLargeur", "", 1, 1);


addLabel
("lbAire", "Aire:", 0, 2);


addLabel
(
"lbAireResultat", "", 0, 3);


addLabel
("lbPerimetre", "Périmètre:", 1, 2);


addLabel
("lbPerimetreResultat", "", 1, 3);


addButton
("btCalculer", "Calculer", 2, 2);


addButton
("btQuitter", "Quitter", 2, 3);


setVisible
(
true
);


}



public voi
d

action(String id) {


// insérer la gestion des événements ici


if
(id.equals("btQuitter")) {
quit
(); }


else if
(id.equals("btCalculer")) {


float

longueur =
getFloat
("tfLongueur");


float

largeur =
getFloat
("tfLargeur");


if
(Float.
isNaN(longueur) || Float.isNaN(largeur)) {


setText
("lbAireResultat", "Erreur donnée");


setText
("lbPerimetreResultat", "Erreur donnée");


}
else

{


setFloat
("lbAireResultat", longueur*largeur);


setFloat
("lbPerimetreResula
t", 2*(longueur+largeur));


}


}


}

}

Code 2

:

Premier programme (
PremierExemple.java
)


Le code
coloré en bleu

représente les mots clés du langage Java. Le code
coloré en vert

représente les méthodes (ou fonctions) spécifiques du composant
SLPack
.

Les éléments
colorés en gris

sont des commentaires.


Le
placement des composants

est réalisé dans la méthode
PremierExemple
. On
remarque que l’on commence par définir la taille de la fenêtre (on en parlera plus tard).
Ensuite, on définit le titre de la fe
nêtre, on ajoute les différents composants

:



Ajout de texte via les
labels
. On peut ajouter autant de texte que souhaité en utilisant
la méthode / fonction
addLabel
.



Ajout de champs de saisie (ou
TextField
) afin de permettre à l’utilisateur d’encoder
des
informations (comme la longueur et la largeur dans cet exemple). Les champs de
saisie sont ajoutés avec la méthode / fonction
addTextField
.



Ajout de boutons pour déclencher des actions. Dans notre cas il s’agit des boutons
Calculer
et
Quitter
. Les boutons
sont ajoutés avec la méthode / fonction
addButton
.
Lorsque l’utilisateur clique sur un bouton, il déclenche une action. L’action est
programmée dans la méthode
action
.

© L. Swinnen, 2010


8

La méthode
action

décrit
les actions à déclencher lorsqu’un utilisateur clique sur un
bo
uton
. Ainsi, lorsque l’utilisateur clique sur un bouton placé dans une fenêtre, il faut
associer un comportement (des instructions) particulier.


Lorsque l’utilisateur clique sur le bouton
Calculer
, il faut afficher les résultats dans la fenêtre.
Lorsque
l’utilisateur clique sur le bouton
Quitter
, il faut sortir du programme. Il est possible
de distinguer le bouton sur lequel l’utilisateur a cliqué (Calculer ou Quitter) grâce au
paramètre
id

présent dans la méthode / fonction action. Le paramètre
id

repren
d l’identifiant
du bouton sur lequel l’utilisateur a cliqué.



Attention

! Les champs de saisie ne permettent pas de faire des vérifications (comme
scanf
).
Rien n’interdit à l’utilisateur d’entrer une donnée incorrecte par rapport à ce qui est attendu.
S’
il rentre un caractère à la place de la longueur, il y aura une erreur.


La fenêtre 2 montre un tel exemple.




Fenêtre 2

:

erreur dans la saisie des données


On voit que la barre d’information annonçant la version est passée en couleur rouge. Cela
indiq
ue qu’une erreur s’est produite dans le composant
SLPack
. Il faut alors examiner la
console pour identifier le problème (ici, erreur de conversion du champ longueur vers un
float
).


2.3 La fenêtre, la taille et le placement des composants

Dans
SLPack
, la
fenêtre est divisée en ligne et colonne (comme on peut le voir sur la fenêtre
3). Les objets sont alors placés dans une «

case

» particulière de la fenêtre. On peut
également mentionner la hauteur et la largeur de chaque composant.


Ainsi, dans l’exemple (
fenêtre 3), nous avons une fenêtre de taille
3 lignes x 4 colonnes
.
Nous avons décidé de placer

:



Des
labels

dans les cases suivantes

: (0,0)

; (0,2)

; (0,3)

; (1,0)

; (1,2)

; (1,3)



Des
textfields

dans les cases suivantes

: (0,1)

; (1,1)



Des
buttons

dans l
es cases suivantes

: (2,2)

; (2,3)


Il reste 2 cases vides

aux positions (2,0) et (2,1).

© L. Swinnen, 2010


9


Fenêtre 3

:

fenêtre et composants


Pour déterminer la taille de la fenêtre, il faut utiliser la méthode
setDimension
. Cette fonction
/ méthode permet d’indiquer le n
ombre de lignes et le nombre de colonnes souhaités. Elle
permet également de mentionner la
taille minimale

de chaque composant. Nous décrirons
exactement cette fonction plus loin.


En ce qui concerne le placement des composants, chaque méthode d’ajout de c
omposant
addLabel
,
addButton

et
addTextField

prend comme paramètre la position de ce composant
et sa taille exprimée en
nombre de cases
. Si la taille n’est pas précisée, la taille par défaut
est 1 case en hauteur et 1 case en largeur.


© L. Swinnen, 2010


10

3. Les composants

Le package SLPack permet d’utiliser
5

types de composants graphiques. Il y a les boutons,
les zones de texte, les champs de saisie
, la liste déroulante

et les tables.


Chaque composant est identifié au moyen d’une chaîne de caractère. Il ne peut y avoir de
ux
composants ayant même valeur comme identifiant. Les identifiants servent à gérer les
actions sur ces composants.


3.1 Le bouton

Le bouton est un composant permettant à l’utilisateur de commander l’application. Lorsqu’un
utilisateur clique sur un bouton,

il déclenche une action programmée. Les boutons seront
donc utilisés pour commander l’application.


L’aspect graphique d’un bouton est

:




Le bouton est ajouté dans la fenêtre par la méthode
addButton
. Il faut donner un identifiant
au bouton. Par conve
ntion, on utilisera un identifiant commençant par les lettres
bt
.


La gestion des événements est expliquée dans
la section 4
.


3.2 La zone de texte (ou label)

La zone de texte est une zone permettant d’afficher un texte donné. Le texte n’est pas
éditable.
Il peut être fixé par le programmeur au moment de la création du composant ou
être fixé par après.


Dans le code 2, nous avons des textes dont la valeur est spécifiée à la création du
composant (par exemple pour le
label

identifié par
lbAire
) ou lors de l’
exécution du
programme (par exemple pour le
label

identifié par
lbAireResultat
) et la fonction
setFloat
.


L’aspect graphique d’une zone de texte est

:



La zone de texte est ajoutée dans la fenêtre par la méthode
addLabel
. Il faut donner un
identifiant a
u
label
. Par convention, on utilisera un identifiant commençant par les lettres
lb
.


Les méthodes (comme
setFloat
) pour modifier le contenu d’un composant seront vues dans
la
section 5
.


3.3 Le champ de saisie (ou TextField)

Le champ de saisie est un champ

permettant à l’utilisateur d’encoder une donnée. Le champ
de saisie est éditable par l’utilisateur. Le programmeur peut fixer une valeur à l’intérieur
(bien que la plupart du temps, le champ de saisie est vide) lors de la création du composant
ou par aprè
s.


© L. Swinnen, 2010


11

Dans le code 2, nous avons créé des champs de saisie vides pour permettre à l’utilisateur
d’encoder le périmètre et l’aire. Ces champs étaient identifiés par
tfLongueur

et
tfLargeur
.


Puisqu’il s’agit de données introduites par l’utilisateur, il faut
pouvoir récupérer la valeur de
ces données. Cela se fait grâce aux méthodes
getText, getFloat, getInteger

ou
getDouble
.

L’aspect graphique d’un champ de saisie est

:



Le champ de saisie est ajouté dans la fenêtre par la méthode
addTextField
. Il faut
ment
ionner un identifiant au
textfield
. Par convention, on utilisera un identifiant commençant
par les lettres
tf
.


Les méthodes (comme
getFloat
) pour lire le contenu d’un composant seront vues dans la
section 5
.


3.4 La liste déroulante

La liste déroulante e
st un composant graphique permettant à l’utilisateur de choisir une
valeur parmi une liste de chaînes de caractères déjà établie. Le contenu initial est fixé par le
programmeur lors de la création du composant.


L’aspect graphique d’une liste déroulante es
t

:



La liste déroulante est ajoutée dans la fenêtre par la méthode
addComboBox

ou
addExtendedComboBox
. Il faut mentionner un identifiant à la
combobox
. Par convention, on
utilisera un identifiant commençant par les lettres
cb

(pour une ComboBox standard
) ou
ecb
(pour une ExtendedComboBox).


Les méthodes pour récupérer l’élément sélectionné (comme
getSelectedIndex
)
, pour
sélectionner un élément (comme
setSelectedIndex
)
, pour fixer la liste de valeur (comme
setList
ComboBox
ou

setListComboBoxExtended
)

ou ré
cupérer la liste de valeur (via
getList
ComboBox
ou
getListExtendedComboBox
) sont décrites dans la

section

6
.




3.
5

La table

La table est un composant graphique permettant d’afficher un tableau à 2 dimensions.
Toutes les cases sont éditables. Le contenu in
itial peut être fixé par le programmeur lors de
la création du composant.


Lorsque le programmeur a besoin de récupérer les données contenues dans la table, il peut
faire appel aux méthodes
getIntegerTable, getFloatTable, getDoubleTable
ou
getStringTable

.


Le programmeur peut également connaître la ligne sélectionnée par l’utilisateur au moyen de
la méthode
getSelectedIndex

qui retourne l’index dans la table de la ligne sélectionnée.


© L. Swinnen, 2010


12

Enfin, la ligne des titres peut également être fixée par le programmeur
au moyen de la
méthode
setTitleTable

ou lors de la création de la table.


L’aspect graphique d’une table (d’entier) est

:



La table est ajoutée dans la fenêtre par la méthode
addArray
. Il faut donner un identifiant à
la table. Par convention, on utiliser
a un identifiant commençant par les lettres
tb
.


Les méthodes pour récupérer le contenu du composant (comme
getIntegerTable
) ou celles
pour modifier le contenu du composant (comme
setIntegerTable
) seront vues dans la
section
6
.








© L. Swinnen, 2010


13

4. Les événements

L
orsqu’un utilisateur clique sur un bouton dans la fenêtre, il faut
déclencher une action
. En
fait, lorsqu’un utilisateur déclenche une telle action, la méthode
action

est appelée.


Le schéma 1 montre l’action déclenchée par l’utilisateur lorsque celui
-
ci
clique sur le bouton
identifié par btQuitter.



b
t
Q
u
i
t
t
e
r
p
u
b
l
i
c

v
o
i
d

a
c
t
i
o
n
(
S
t
r
i
n
g

i
d
)
{
}
b
t
Q
u
i
t
t
e
r
L

u
t
i
l
i
s
a
t
e
u
r

c
l
i
q
u
e
s
u
r

l
e

b
o
u
t
o
n

Schéma 1

:

déclenchement d’un événement


Comme précisé plus haut, lorsqu’un utilisateur clique sur le bouton, la méthode
action

est
automatiquement

appelée. Afin d’identifier clai
rement le bouton sur lequel l’utilisateur a
cliqué, le paramètre
id

contient
l’identifiant du bouton sur lequel l’utilisateur a cliqué.


Dans notre schéma 1,
id

prend la valeur
btQuitter

qui est l’identifiant du bouton Quitter. De
cette manière, si notre f
enêtre propose plusieurs boutons, nous serons toujours capables
d’identifier clairement le choix de l’utilisateur. Il suffit, pour ce faire, de comparer la valeur
de
id

avec les identifiants de chaque bouton.


Le code 2 montre un exemple d’utilisation ave
c deux boutons,
btQuitter
et
btCalculer

:

if
(id.equals("btQuitter")) {




action à programmer lors d’un clic sur le bouton quitter.


}
else if
(id.equals("btCalculer")) {




action à programmer lors d’un clic sur le bouton calculer.


}



Dans notre système
simplifié, il n’est possible de capturer les événements que sur les
boutons. Il convient donc d’utiliser les boutons pour commander l’application.





© L. Swinnen, 2010


14

5. Construction de la fenêtre

Dans cette section, nous allons détailler les méthodes avec précision afin

de permettre
l’utilisation du composant
SLPack
. Les méthodes sont proposées dans l’ordre logique de leur
utilisation.


5.1 setDimension

void setDimension(int row, int col, int minimumSize)

void setDimension(int row, int col, boolean sameSize)


Comme mont
ré ci
-
dessus, il existe 2 versions de la méthode
setDimension
. Dans les deux
cas, les 2 premiers paramètres sont communs et permettent de déterminer la taille de la
fenêtre en
nombre de cases
. Il faut spécifier le nombre de lignes (dans le paramètre
row
) e
t
le nombre de colonnes (dans le paramètre
col
).


Dans la 1
ère

version, le dernier paramètre est un entier
minimumSize

définissant la taille
minimale d’une case.


Dans la 2
ème

version, le dernier paramètre est un booléen déterminant si toutes les cases
d
oivent avoir la même largeur ou pas.


Il faut définir la taille de la fenêtre
avant de placer
des composants à l’intérieur.
Si vous oublier de mentionner une taille de fenêtre, le système crée une fenêtre
de taille 3 lignes x 3 colonnes.


Si vous tentez d
e définir la taille de la fenêtre après avoir placé un composant,
vous recevrez un message d’erreur.


Exemple

:

setDimension (3, 4, 80);

Cet appel définit la taille de la fenêtre à 3 lignes et 4 colonnes (donc 12 cases) avec une
taille minimale pour les ca
ses de 80 points (ou pixel).


setDimension (3,3, true);

Cet appel définit la taille de la fenêtre à 3 lignes et 3 colonnes (donc 9 cases). Chaque case
ayant une taille identique (la taille de la plus grande case sera utilisée).


setDimension(5,3, false);

Cet appel définit la taille de la fenêtre à 5 lignes et 3 colonnes (donc 15 cases). Les cases
ayant des tailles proportionnelles à leur contenu.



5.2 setTitle

void setTitle(String title)


Cette méthode permet de fixer le titre de la fenêtre à la chaîne
ti
tle

passée en paramètre.


Exemple

:

setTitle ("Calcul rectangle");

Place le titre «

Calcul rectangle

» à la fenêtre.


© L. Swinnen, 2010


15

5.3 addButton

boolean addButton(String id, String content, int row, int col)

boolean addButton(String id, String content, int row, int col
, int width,


int height)


La seconde version de la méthode est la version la plus complète. Ces méthodes permettent
de placer un bouton dans la fenêtre. Lorsqu’on ajoute un bouton, il faut préciser les données
suivantes

:



id



l’identifiant de
ce composant sous la forme d’une chaîne de caractère. Cet
identifiant permet de déterminer si un utilisateur a cliqué sur ce bouton.



content



détermine le texte à placer dans le bouton



row



détermine la ligne dans laquelle le bouton doit être placé. La p
remière ligne
est la ligne 0.



col



détermine la colonne dans laquelle le bouton doit être placé. La première
colonne est la colonne 0. Associé à la valeur précédente, nous avons la case où le
bouton sera placé



width



détermine la largeur en nombre de col
onnes du composant. Si elle n’est pas
mentionnée, la largeur par défaut est 1.



height



détermine la hauteur en nombre de lignes du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est 1.


La fonction retourne un booléen indiquant si le b
outon a pu être placé dans la (ou les)
case(s) mentionnée(s).


Exemple

:

addButton ("btCalculer", "Calculer", 2,2);

Cet appel ajoute un bouton identifié par
btCalculer

dont le texte visible est
calculer

dans la
case (2,2)
-

donc 3
ème

ligne, 3
ème

colonne.
La hauteur et la largeur par défaut (1 case) est
utilisée.


5.4 addLabel

boolean addLabel(String id, String content, int row, int col)

boolean addLabel(String id, String content, int row, int col, int width,


int height)


La seconde version de l
a méthode est la plus complète. Ces méthodes permettent de placer
un texte non modifiable (appelé
label
) dans la fenêtre. Lorsqu’on ajoute un
label
, il faut
préciser les données suivantes

:



id



l’identifiant de ce composant sous la forme d’une chaîne de c
aractère. Cet
identifiant permet de modifier le texte ou d’en obtenir la valeur.



content



détermine le texte à placer dans la zone.



row



détermine la ligne dans laquelle le
label

doit être placé. La première ligne est
la ligne 0.



col



détermine la colon
ne dans laquelle le
label

doit être placé. La première
colonne est la colonne 0. Associé à la valeur précédente, nous avons la case où le
label

sera placé



width



détermine la largeur en nombre de colonnes du composant. Si elle n’est pas
mentionnée, la lar
geur par défaut est 1.



height



détermine la hauteur en nombre de lignes du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est 1.


© L. Swinnen, 2010


16


La fonction retourne un booléen indiquant si le bouton a pu être placé dans la (ou les)
case(s) mentionn
ée(s).


Exemple

:

addLabel ("lbAire", "Aire", 0,2);

Cet appel ajoute un label identifié par
lbAire

dont le texte affiché est
Aire

dans la case (0,2)
-

donc 1
ère

ligne, 3
ème

colonne. La hauteur et la largeur par défaut (1 case) est utilisée.



5.5 addTextF
ield

boolean addTextField(String id, String content, int row, int col)

boolean addTextField(String id, String content, int row, int col,


int width, int height)


La seconde version de la méthode est la plus complète. Ces méthodes permettent de pla
cer
un champ de saisie (appelé
TextField
) dans la fenêtre. Lorsqu’on ajoute un
TextField
, il faut
préciser les données suivantes

:



id



l’identifiant de ce composant sous la forme d’une chaîne de caractère. Cet
identifiant permet d’obtenir le texte entré o
u d’en fixer la valeur.



content



détermine le texte par défaut à placer dans la zone.



row



détermine la ligne dans laquelle le
TextField

doit être placé. La première ligne
est la ligne 0.



col



détermine la colonne dans laquelle le
TextField

doit être pl
acé. La première
colonne est la colonne 0. Associé à la valeur précédente, nous avons la case où le
label

sera placé



width



détermine la largeur en nombre de colonnes du composant. Si elle n’est pas
mentionnée, la largeur par défaut est 1.



height



déterm
ine la hauteur en nombre de lignes du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est 1.


La fonction retourne un booléen indiquant si le
TextField

a pu être placé dans la (ou les)
case(s) mentionnée(s).


Exemple

:

addTextField ("tfL
argeur", "", 1,1);

Cet appel ajoute un textfield identifié par
tfLargeur

sans texte par défaut (l’utilisateur devra
remplir la zone) dans la case (1,1)
-

donc 2
ème

ligne, 2
ème

colonne. La hauteur et la largeur
par défaut (1 case) est utilisée.



Affiche l
a fenêtre construite précédemment.


5.6 addComboBox

boolean addComboBox(String id, String[] content, int row, int col)

boolean addComboBox(String id, String[] content, int row, int col, int
width, int height)


Ces méthodes permettent d’ajouter une liste dé
roulante
simple
dans une fen
être. Les valeurs
init
iales sont données en paramètre
. Par défaut, la première valeur est sélectionnée et
© L. Swinnen, 2010


17

affichée. Lorsqu’on ajoute une liste déroulante dans une fenêtre, il faut préciser les données
suivantes

:



id



l’identifi
ant de ce composant sous la forme d’une chaîne de caractère. Cet
identifiant permet d’obtenir les valeurs de la liste, par la suite.



content



détermine la source des données. Il doit s’agir d’un tableau contenant
des données de type String.



row



détermin
e la ligne à laquelle la
table

doit être placée. La première ligne est la
ligne 0.



col



détermine la colonne à laquelle la
table

doit être placée. La première colonne
est la colonne 0. Associé à la valeur précédente, nous avons la case début contenant
le
composant



width



détermine la largeur en nombre de colonne du composant. Si elle n’est pas
mentionnée, la largeur par défaut est 1.



height



détermine la hauteur en nombre de lignes du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est

1.

5.
7

add
Extended
ComboBox

boolean add
Extended
ComboBox(String id, String[]
[] content,
int row, int col)

boolean add
Extended
ComboBox(String id, String[]
[]

content, int row, int
col, int width, int height)


Ces méthodes permettent d’ajouter une liste déroula
nte
étendue
dans une fen
être. Les
valeurs initiales sont données en paramètre. Par défaut, la première valeur est sélectionnée
et affichée. Lorsqu’on ajoute une liste déroulante dans une fenêtre, il faut préciser les
données suivantes

:



id



l’identifiant
de ce composant sous la forme d’une chaîne de caractère. Cet
identifiant permet d’obtenir les valeurs de la liste, par la suite.



content



détermine la source des données. Il doit s’agir d’un tableau à 2
dimensions contenant des données de type String. Seu
le la dernière colonne est
affichée dans la combobox, les autres colonnes ne sont pas affichée mais sont
présentes dans le composant. Par exemple, pour garder l’identifiant et les valeurs.



row



détermine la ligne à laquelle la
table

doit être placée. La p
remière ligne est la
ligne 0.



col



détermine la colonne à laquelle la
table

doit être placée. La première colonne
est la colonne 0. Associé à la valeur précédente, nous avons la case début contenant
le composant



width



détermine la largeur en nombre de c
olonne du composant. Si elle n’est pas
mentionnée, la largeur par défaut est 1.



height



détermine la hauteur en nombre de lignes du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est 1.



5.
8

addArray

boolean addArray(String id, int[][
] content, int row, int col)

boolean addArray(String id, int[][] content, int row, int col, int width,

int height)

boolean addArray(String id, int[][] content, String[] title, int row,

int col, int width, int height)


boolean addArray(String id, float[][
] content, int row, int col)

boolean addArray(String id, float[][] content, int row, int col,

int width, int height)

© L. Swinnen, 2010


18

boolean addArray(String id, float[][] content, String[] title, int row,

int col, int width, int height)


boolean addArray(String id, doub
le[][] content, int row, int col)

boolean addArray(String id, double[][] content, int row, int col,


int width, int height)

boolean addArray(String id, double[][] content, String[] title, int row,






int col, int width, int height)

boolean addArray(Strin
g id, String[][] content, int row, int col)

boolean addArray(String id, String[][] content, String[] title, int row,






int col, int width, int height)



Ces méthodes permettent d’afficher un tableau dans une fenêtre. Le tableau est affiché et
entièremen
t modifiable. Lorsqu’on ajoute un tableau dans une fenêtre, il faut préciser les
données suivantes

:



id



l’identifiant de ce composant sous la forme d’une chaîne de caractère. Cet
identifiant permet d’obtenir les valeurs de la table, par la suite.



content



détermine la source des données. Il doit s’agir d’un tableau à 2
dimensions contenant des données de type int, float, double ou String.



title



détermine la ligne de titre. Il doit s’agir d’un tableau de String dont le
nombre de colonnes doit correspond
re à celui des données. Cet élément n’est pas
obligatoire.



row



détermine la ligne à laquelle la
table

doit être placée. La première ligne est la
ligne 0.



col



détermine la colonne à laquelle la
table

doit être placée. La première colonne
est la colonne
0. Associé à la valeur précédente, nous avons la case début contenant
le composant



width



détermine la largeur en nombre de colonne du composant. Si elle n’est pas
mentionnée, la largeur par défaut est 1.



height



détermine la hauteur en nombre de lignes
du composant. Si celle
-
ci n’est
pas mentionnée, la hauteur par défaut est 1.



5.
9

setVisible

void setVisible(boolean value)


Cette méthode permet d’afficher ou de cacher la fenêtre. Le paramètre de cette méthode
est

:



value



qui est un booléen. Si la val
eur est
true
, le système construit la fenêtre et
place les différents composants à l’intérieur et rend cette fenêtre visible. Si la valeur
est
false
, le système cache la fenêtre.


Cette méthode doit être appelée une seule fois lorsque tous les composants o
nt été placés
sur la fenêtre.


Exemple

:

setVisible(true);


5.
10

messageOKBox

int messageOKBox(String message)

© L. Swinnen, 2010


19


Cette méthode permet d’afficher une petite fenêtre d’information reprenant le message
passé en paramètre. Utile pour informer l’utilisateur d’u
n événement.


La valeur entière retournée est 0.


Exemple

:

messageOKBox("La valeur entrée n’est pas valide");




5.
11

messageYESNOBox

int messageYESNOBox(String message)


Cette méthode permet d’afficher une fenêtre de confirmation avec les boutons
OUI, N
ON et
ANNULER
. Le message affiché dans la fenêtre est celui passé en paramètre.


La valeur entière retournée dépend du bouton sur lequel l’utilisateur a cliqué. S’il a cliqué
sur

le bouton :



OUI, la valeur retournée est
0



NON, la valeur retournée est 1



AN
NULER, la valeur retournée est
2



De fermeture de la fenêtre (la croix en haut à droite), la valeur retournée est
-
1


Exemple

:

rep

= messageYESNOBox(
"Voulez
-
vous quitter

?

");



5.1
2

inputIntegerBox

int inputIntegerBox(String message)


Cette méthode perme
t de demander à l’utilisateur une valeur entière. Une fenêtre spécifique
apparaît avec le message passé en paramètre.


La valeur entière retournée est celle saisie par l’utilisateur
pour autant que le format est
correct
ou la valeur particulière
Integer.M
IN_VALUE

(plus petite valeur représentable sur
un entier)
en cas d’erreur

ou
d’abandon

de la saisie (choix du bouton
annuler

ou
fermeture par la croix en haut à droite de la fenêtre).

© L. Swinnen, 2010


20


Exemple

:

age = inputIntegerBox(
"Entrez l’age

:");

if(age == Integer.MI
N_VALUE) { // Erreur dans la saisie }




5.1
3

inputFloatBox

float inputFloatBox(String message)


Cette méthode permet de demander à l’utilisateur de saisir une valeur réelle. Une fenêtre
spécifique apparaît avec le message passé en paramètre.


La valeur r
éelle retournée est celle saisie par l’utilisateur
pour autant que le format soit
correct

ou la valeur particulière
Float.NaN

(problème de conversion)
en cas d’erreur

ou
d’abandon

de la saisie (choix du bouton
annuler

ou fermeture par la croix en haut à dr
oite
de la fenêtre).


Exemple

:

longueur = inputFloatBox(
"Entrez la longueur

:");

if(Float.isNaN(longueur)) { // Erreur dans la saisie }




5.1
4

inputDoubleBox

double inputDoubleBox(String message)


Cette méthode permet de demander à l’utilisateur de sais
ir une valeur réelle précise. Une
fenêtre spécifique apparaît avec le message passé en paramètre.


La valeur
double

retournée est celle saisie par l’utilisateur
pour autant que le format soit
correct

ou la valeur particulière
Double.NaN

(problème de conver
sion)
en cas d’erreur
ou
d’abandon

de la saisie (choix du bouton
annuler

ou fermeture par la croix en haut à
droite de la fenêtre).


Exemple

:

largeur = inputDoubleBox(
"Entrez la largeur

:");

if(Double.isNaN(largeur)) { // Erreur dans la saisie }


© L. Swinnen, 2010


21



5.1
5

inputStringBox

String inputStringBox(String message)


Cette méthode permet de demander à l’utilisateur de saisir une chaîne de caractère. Une
fenêtre spécifique apparaît avec le message passé en paramètre.


La chaîne retournée est celle saisie par l’utilis
ateur ou la référence
null

si l’utilisateur choisit
le bouton
annuler

ou clique sur la croix (en haut à droite).


Exemple

:

nom = inputStringBox(
"Entrez votre nom

:");

if(nom == null) { // Abandon de la saisie }






5.1
6

inputFileChooserBox

String inputF
ileChooserBox()


Cette méthode permet à l’utlisateur d’aller sélectionner un fichier en parcourant les fichiers
et répertoire de son ordinateur. S’il choisit d’abandonner la sélection, la méthode retourne la
référence
null

sinon le chemin complet vers le f
ichier sélectionné est retourné.


Exemple

:

nomFichier = inputFileChooserBox()

;


L’exécution de cette méthode entraînera l’affichage d’une fenêtre standard de sélection dont
nous pouvons voir un exemple ci
-
dessous.

© L. Swinnen, 2010


22



6. Méthodes usuelles

6.1 Comment quit
ter

? les méthodes quit et canQuit

void quit()

boolean canQuit()


La méthode
quit()

est la méthode qui doit être appelée pour quitter l’application. Cette
méthode appelle la méthode
canQuit()
. En fonction du résultat, l’application se termine ou
non.


La m
éthode
quit()

est également
appelée automatiquement

lorsque l’utilisateur clique
sur la croix de fermeture de la fenêtre (en haut à droite).


La méthode
canQuit()

permet

:



de demander à l’utilisateur une confirmation

;



de libérer toutes les ressources néce
ssaires (sauvegarde et fermeture de fichiers, …)



de clôturer les opérations avant de quitter


Si la méthode
canQuit()

retourne
true
, l’application se ferme. Si la méthode
canQuit()

retourne
false
, l’application reste active.


Une méthode
canQuit()

par défa
ut est déjà programmée et retourne la valeur
true
. Il
vous est possible de changer cette méthode pour l’adapter à vos besoins.



Exemple

:

public boolean canQuit() {


int rep

;


rep = messageYESNOBox(
"Voulez
-
vous vraiment quitter

?");


return(rep

== 0); // Si l’utilisateur clique sur Oui
-
> true

}

© L. Swinnen, 2010


23


public void action(String id) {


if(id.equals("btCalculer")) {


...


} else if(id.equals("btQuitter")) {


quit();


}

}


Dans cet exemple, par la programmation de la méthode
canQuit()
, nous

avons choisi de
programmer une confirmation avant de quitter. Si l’utilisateur clique sur le bouton
Quitter

(identifié dans le code par
btQuitter
)
ou

si l’utilisateur clique sur la croix de fermeture de la
fenêtre (en haut à droite), la méthode
canQuit()

est exécutée et une demande de
confirmation est affichée à l’écran. L’utilisateur peut choisir de confirmer ou d’annuler la
fermeture de l’application.


6.2 Extraire une valeur d’un composant

String getText(String id)

double getDouble(String id)

float getF
loat(String id)

int getInteger(String id)


Ces méthodes permettent d’extraire le contenu d’un composant sous la forme d’une chaîne
de caractères (pour
getText()
), d’un réel précis (pour
getDouble()
), d’un réel (pour
getFloat()
) ou d’un entier (pour
getInte
ger()
).


Le paramètre
id

doit désigner l’identifiant d’un composant existant dans la fenêtre. Si
l’identifiant désigne un composant de type

:



label



les méthodes retournent le texte affiché



textfield


les méthodes retournent le texte saisi par l’utilisat
eur



button


les méthodes retournent le texte du bouton


Pour les tables, des méthodes particulières sont utilisées. Elles sont détaillées ci
-
dessous.


Si, lors de la conversion, une erreur survient, ces méthodes retournent des valeurs
particulières

:



getD
ouble()

retourne la valeur
Double.NaN

en cas d’erreur de conversion



getFloat()

retourne la valeur
Float.NaN

en cas d’erreur de conversion



getInteger()

retourne la valeur
Integer.MIN_VALUE

en cas d’erreur de
conversion


Exemples

:

age = getInteger("tfAge");

longueur = getFloat("lbLongueur");

double largeur = getDouble("tfLargeur");

String texteBouton = getString("btQuitter");


Dans cet exemple, l’
age

est extrait du composant
tfAge
. En cas d’erreur de conversion de la
valeur entière (si l’utilisateur n’entre

pas une valeur valide),
age

prendra la valeur
Integer.MIN_VALUE
.


La
longueur

est extraite du composant
lbLongueur
. En cas d’erreur de conversion de la
valeur réelle (si le format n’est pas correct),
longueur

prendra la valeur
Float.NaN
.

© L. Swinnen, 2010


24


La
largeur

est e
xtraite du composant
tfLargeur
. En cas d’erreur de conversion de la valeur
réelle précise (si le format n’est pas correct),
largeur

prendra la valeur
Double.NaN
.


La donnée
texteBouton

est extraite du composant
btQuitter

(s’il s’agit d’un bouton, c’est le
texte du bouton qui est retourné).


6.3 Placer une valeur dans un composant

boolean setText(String id, String val)

boolean setFloat(String id, float val)

boolean setDouble(String id, double val)

boolean setInteger(String id, int val)


Ces méthodes permette
nt de «

placer

» la valeur
val

dans le composant identifié par la
chaîne
id
. Il faut que le composant
id

existe dans la fenêtre.



Si l’identifiant désigne un composant de type

:



label



les méthodes modifient le texte placé dans ce label



textfield


les m
éthodes modifient le champ de saisie pour y placer la valeur



button


les méthodes modifient le texte affiché sur le bouton



Ces méthodes retournent
une valeur booléenne

qui prend

:



la valeur
true

si la modification a été effectuée



la valeur
false

si le c
omposant identifié par
id

n’a pas pu être trouvé.


Exemples

:

setFloat(
"lbAireResultat", longueur*largeur);

setText("lbAireResultat", "Erreur de donnée");

setDouble("tfLargeur", 3.5);

setInteger("btNum", 1);


Dans le 1
ier

exemple, le résultat de l’expressi
on
longueur*largeur

est placé dans le
composant
lbAireResultat

(sous la forme d’un réel). Le contenu précédent est perdu.


Dans le 2
ème

exemple, le texte
Erreur de donnée

est placé dans le composant
lbAireResultat
.
Le contenu précédent est perdu.


Dans le
3
ème

exemple, la valeur 3,5 est placé dans le composant
tfLargeur

(sous la forme
d’un réel précis). Le contenu précédent est perdu.


Dans le 4
ème

exemple, la valeur 1 est placée dans le composant
btNum

(sous la forme d’un
entier). Le contenu précédent est
perdu.


6.4 Gérer les listes déroulantes

Une liste déroulante est un composant reprenant une collection de valeur. Elle ne peut donc
pas être gérer de la même façon que les composants précédents.


Il existe deux versions pour la liste déroulante, la
ComboB
ox

et l’
ExtendedComboBox
. Il
s’agit
du même composant graphique
. La seule différence est que la
ComboBox

gère et
affiche une seule liste d’élément. En revanche, l’
ExtendedComboBox

gère une table complète
© L. Swinnen, 2010


25

et n’affiche qu’une seule colonne
, la dernière
. Son principal int
érêt est de pouvoir afficher
des valeurs mais garder en mémoire des informations complémentaires comme des
identifiants par exemple. Ce composant est particulièrement utile pour les bases de données.


Dans les 2 versions, i
l n’y a pas de méthode particuliè
re pour modifier un élément déterminé
de la liste, il est nécessaire d’agir sur l’ensemble. Ainsi, il est possible de récupérer
l’ensemble des valeurs sous la forme d’un tableau de chaînes de caractères ou encore d’en
spécifier un ensemble de nouvelles val
eurs.


Voici les méthodes intéressantes pour la gestion de ces listes déroulantes

:


a) cas d’une combobox

boolean setList
ComboBox
(String id, String[] content)

String[] getList
ComboBox
(String id)

int getSelectedIndex(String id)

void setSelectedIndex(String

id, int index)


La méthod
e

setList
ComboBox

permet de fixer ou modifier le contenu de la liste déroulante.
La liste est alors directement mise à jour en fonction du contenu du tableau de chaîne fourni
en paramètre.


La méthode
getList
ComboBox

permet d’obte
nir la liste des valeurs de la liste déroulante.

Les
valeurs sont retournées sous la forme d’un tableau de chaines de caractères.


La méthode
getSelectedIndex

permet de connaître l’index dans la liste qui est actuellement
sélectionné et choisi par l’utilis
ateur. Il s’agit de l’indice dans le tableau de valeur, la 1
ère

valeur se trouve à l’indice 0.


La méthode
setSelectedIndex

permet de sélectionner un élément dans la liste. Cette
méthode est particulièrement intéressante avant l’affichage des valeurs pour
que l
a valeur
affichée soit définie (par défaut, il s’agit du 1
ier

élément de la liste). Cette méthode prend, en
paramètre, l’identifiant de la combobox et l’indice dans le tableau, à sélectionner. Il faut
noter que la 1
ère

valeur se trouve à l’indice 0.


Exemple

:

String[] maListe = {"zero", "un", "deux", "trois" }

;


.


.


.

setList
ComboBox("cbListe", maListe)
;

setSelectedIndex("cbListe", 2);

System.out.println("La valeur selectionne est

: " +

maListe[getSelectedIndex("cbListe")
])

;


b) cas d’une Exte
ndedComboBox

boolean set
List
Extended
ComboBox
(String id, String[]
[]

content)

String[]
[]

getList
ExtendedComboBox
(String id)

int getSelectedIndex(String id)

void setSelectedIndex(String id, int index)


La méthod
e

setList
Extended
ComboBox

permet de fixer ou modifier le

contenu de la liste
déroulante.
La liste est alors directement mise à jour en fonction du contenu du tableau de
chaîne fourni en paramètre

(seule la dernière c
olonne est affichée)
.


© L. Swinnen, 2010


26

La méthode
getList
Extended
ComboBox

permet d’obtenir la liste des valeurs
complète (tout le
tableau) et non pas uniquement la liste affichée
.
Les valeurs sont retourné
es sous la forme
d’un tableau de chaines de caractères.


La méthode
getSelectedIndex

permet de connaître l’index dans la liste qui est actuellement
sélectionné et choisi par l’utilisateur. Il s’agit de l’indice dans le tableau de valeur, la 1
ère

valeur se
trouve à l’indice 0.


La méthode
setSelectedIndex

permet de sélectionner un élément dans la liste. Cette
méthode est particulièrement intéressante avant l’affichage des valeurs pour que la valeur
affichée soit définie (par défaut, il s’agit du 1
ier

élément

de la liste). Cette méthode prend, en
paramètre, l’identifiant de la combobox et l’indice dans le tableau, à sélectionner. Il faut
noter que la 1
ère

valeur se trouve à l’indice 0.


Exemple

:

String[]
[]

maListe = {

{
"
1
"
,
"zero"
}
,
{
"
2
"
,
"un"
}
,
{
"
3
"
,
"deux"
}
,


{
"
4
"
,
"trois"
}

}

;


.


.


.

setList
Extended
ComboBox("
e
cbListe", maListe)
;

setSelectedIndex("
e
cbListe", 2);


.


.


.

String[][] val = getListExtendedComboBox(
"
ecbListe
"
);

System.out.println("La valeur selectionne est

:
"

+

val
[getSelectedIndex("
e
cbListe")
]
[1]

+
"

et l

ID est
"

+

val[getSelectedIndex(
"
ecbListe
"
)][0]
)

;



© L. Swinnen, 2010


27


6.
5

Gérer les tables

Une table est un composant un peu particulier car il s’agit d’une co
llection de valeur. Elle ne
peut donc pas être gérée de la même façon que pour les composants simples.


Il n’y a pas de méthode pour modifier l’élément spécifique d’une ligne ou d’une colonne de la
table, on doit agir sur l’ensemble. Ainsi, il est possible

de récupérer l’ensemble des valeurs
sous la forme d’un tableau ou encore d’en spécifier un ensemble de valeur
s
.


Pour modifier les titres des colonnes, il faut utiliser la méthode suivante

:

boolean setTitleTable(String id, String [] titre)


Cette méthode

remplace les titres de la table identifiée par
id

par les éléments contenus
dans le tableau
titre

fourni en paramètre. Il faut que le nombre de colonnes du tableau
titre

soit identique à celui des données.



Les méthodes permettant de modifier le contenu
des valeurs affichées sont les suivantes

:

boolean setIntegerTable(String id, int[][] content)

boolean setFloatTable(String id, float[][] content)

boolean setDoubleTable(String id, double[][] content)

boolean setStringTable(String id, String [][] content)


Suivant le type de données dans la table identifiée par
Id
, il faut choisir la méthode
set

adéquate. On peut de cette manière mettre à jour l’ensemble des données de la table. La
méthode retourne
true

si la mise à jour a pu être opérée,
false
sinon.


Exem
ple

:

int[][] table = new Integer[4][4]

;


.


.


.

setIntegerTable("tbEntier1", table);


Dans cet exemple, le composant
tbEntier1

est mis à jour et les données dans la table sont
reprises de la donnée
table

passée en paramètre.



Pour obtenir le contenu

de la table (qui peut avoir été modifié par un utilisateur), il faut
utiliser l’une des méthodes suivantes

:


int[][] getIntegerTable(String id)

float[][] getFloatTable(String id)

double[][] getDoubleTable(String id)

String[][] getStringTable(String id)

i
nt getSelectedIndex(String id)


Suivant le type de données présent dans la table identifiée par
Id
, il faut choisir la méthode
get

adéquate. Ces méthodes permettent de récupérer l’ensemble des données contenues
dans la table sous la forme d’un tableau.


© L. Swinnen, 2010


28

L
a méthode
getSelectedIndex

permet de connaître l’index dans la liste qui est actuellement
sélectionné et choisi par l’utilisateur. Il s’agit de l’indice dans le tableau de valeur, la 1
ère

valeur se trouve à l’indice 0. Si aucune ligne n’est sélectionnée, l
a valeur
-
1 est retournée.



Exemple

:

int[][] matable = new Integer[4][4];


.


.


.

matable = getIntegerTable
(
"tbEntier1");


Dans cet exemple, le contenu de le table
tbEntier1
est retourné et le résultat est placé dans
la donnée matable qui est un tabl
eau à 2 dimensions. Le programme peut alors traiter les
données récupérées.


© L. Swinnen, 2010


29

7. Accès aux bases de données

SLPack permet l’accès aux bases de données de type SQL Server et Oracle. Ces deux SGBDR
(systèmes de gestion de base de données relationnels) sont d
isponibles et utilisés dans le
cadre des laboratoires.


Pour que l’accès fonctionne, il est nécessaire de disposer des drivers JDBC
correctement installés (voir section 1. 3).


Afin de pouvoir accéder à une base de données, un composant particulier
SLDB

a
été
construit. Ce composant permet d’établir la connexion avec un serveur de base de données,
d’exécuter une requête de sélection, d’exécuter une requête de mise à jour, de débuter une
transaction, d’enregistrer les modifications suite à une transaction ré
ussie (
COMMIT
) ou
encore d’abandonner les modifications suite à une transaction annulée (
ROLLBACK
).


7.1 L’objet SLDB

Toutes les méthodes que nous verrons dans cette section s’appliquent sur un objet
particulier, créé pour cet usage, l’objet SLDB.


Avant d
e pouvoir établir une connexion, il est donc nécessaire de créer l’objet SLDB. Pour ce
faire, rien de plus simple, il suffit de le créer comme suit

:

SLDB db = new SLDB()

;


Cette instruction permet de créer un objet de type SLDB qui pourra être utilisé p
our accéder
à la base de données. Par facilité, il vaut mieux déclarer cet objet directement comme
donnée privée de la classe. Ainsi, on trouvera très souvent la définition suivante

:


public class

Programme
extends

SLForm {


private

SLDB db =
new

SLDB();


...



public

Programme() {



...


}

public void

action(String id) {



...


}


public static void

main (String[] args) {



new

Programme();


}

}

code 3

:

Squelette minimal d’un programme avec base de données



7.2 Interaction avec la base de données

Afin d
e permettre des interactions avec la base de données, les méthodes (ou fonctions)
suivantes sont définies

:


7.2.1 Connexion

public boolean connectToOracle(String host, String login, String pass,
String dbName);

© L. Swinnen, 2010


30

public boolean connectToMSSQL(String host, S
tring login, String pass,
String dbName);


Ces deux méthodes permettent la connexion au serveur de base de données. Suivant le
serveur utilisé, on choisira la méthode
connectToOracle

ou
connectToMSSQL
. Ces deux
méthodes prennent les mêmes paramètres

:



host

: le nom ou l’adresse IP du serveur de base de données. À Saint
-
Laurent,
Oracle est disponible sur Laurel (172.16.130.8) et SQL Server sur Hardy
(172.16.130.9).



login

: le nom d’utilisateur pour la connexion



pass

: le mot de passe associé



dbName

: le nom
de la base de données. Sous Oracle, le nom de la base de données
est obligatoirement
XE

(pour eXpress Edition).


Ces méthodes retournent un booléen qui vaut

:



true

si la connexion a pu être établie



false

si une erreur est survenue (reportez
-
vous à la conso
le pour plus
d’explication).


Remarque

:

Si l’erreur suivante apparaît

:
Error while loading the JDBC Driver (driver not found, not in
classpath, …)
, cela signifie que les pilotes JDBC n’ont pas pu être trouvés. Reportez
-
vous à la
section 1.3 pour corriger

cette erreur.


Exemple

:

if(db.connectToOracle("172.16.130.8", "i10299", "3012", "XE")) {


System.out.println(
"
Connexion réussie
"
);

} else {


System.out.println(
"
Connexion ratée
"
);

}


7.2.2 Exécuter une requête de sélection

public String[][] executeQuery(
String requete);


Cette méthode permet de lancer l’exécution d’une requête de sélection (qui retourne un
résultat) sur la base de données. Il est nécessaire que la connexion à la base de données ait
été établie au préalable.


Cette méthode prend, en param
ètre

:



requete



La requête SQL de sélection (
SELECT
) qui doit être envoyée à la base de
données


Cette méthode retourne le résultat de la requête sous la forme d’un tableau de String à deux
dimensions. Le nombre de lignes dépend du
nombre de résultats

ret
ournés par la requête
tandis que le nombre de colonne dépend
du nombre de champs sélectionnés.


En cas d’erreur, la valeur
null

est retournée et un message est envoyé sur la console.


Exemple

:

String[][] tblResultat;

tblResultat = db.executeQuery("SELECT

numLivre, titre, cote FROM livres");



© L. Swinnen, 2010


31

7.2.3 Exécuter une requête de mise à jour

public int executeUpdate(String requete);


Cette méthode permet d’exécuter une mise à jour sur la base de données. Cette mise à jour
est
indépendante
. Si vous souhaitez lier
plusieurs requêtes de mise à jour entre
-
elles, il
convient d’utiliser une transaction.


Avant de pouvoir procéder à l’exécution d’une mise à jour, il est nécessaire que la connexion
vers la base de données ait été établie.


Cette méthode prend, en paramètr
e

:



requete



La requête SQL de mise à jour (
UPDATE
) qui doit être envoyée à la base
de données.


Cette méthode retourne un entier qui correspond
aux nombres de lignes effectivement mises
à jour
après l’exécution de la requête ou
-
1

en cas d’erreur. Si une

erreur survient, un
message sur la console est également envoyé.


Exemple

:

int resultat

= db.executeUpdate("
UPDATE livres SET cote=0
"
);

if(resultat < 0) {


System.out.println(
"
Une erreur est survenue

!
"
);

}


7.2.4 Les transactions

public boolean openTran
saction();

public boolean commit();

public boolean rollback();


Les transactions permettent d’exécuter un ensemble de requêtes ensembles. Ainsi, en cas de
problème, toutes les modifications effectuées peuvent être abandonnées.


Toutes ces méthodes ont une
signature identique

: elles ne prennent aucun paramètre et
retourne un résultat de type booléen. Ainsi, chaque méthode retourne

:



true



si aucune erreur n’a été rencontrée



false



si un problème est survenu. Dans ce cas, un message d’erreur est retourné
s
ur la console.


Pour débuter la transaction, il faut invoquer la méthode
openTransaction()
. Cette
méthode reporte toutes les modifications qui vont être effectuées jusqu’à la clôture de la
transaction. Avant de pouvoir débuter une transaction, il est néces
saire que la connexion
vers la base de données ait été établie.



Pour clôturer la transaction, il faut faire appel à l’une des deux méthodes suivantes

:



commit()



qui va enregistrer les modifications de manière durable dans la base de
données



rollback()



qui retourne à l’état juste avant le début de la transaction et annule
ainsi toutes les modifications.





© L. Swinnen, 2010


32

Exemple

:

if(db.openTransaction()) {


if( (db.executeUpdate("...")>= 0) && (db.executeUpdate("...")>= 0) )



db.commit()

;


else



db.rollback()

;

}


7.2.5 Déconnexion de la base de données

public boolean disconnect();


Afin de libérer les ressources, il est préférable de fermer la connexion à la base de données
de manière explicite. Pour ce faire, il suffit d’invoquer la méthode disconnect().


Cette

méthode retourne un booléen, qui vaut

:



true



si la déconnexion a pu être réalisée sans erreur



false



si une erreur est survenue lors de la déconnexion. Dans ce cas, un message
est également retourné dans la console.


Exemple

:

db.disconnect()

;






























© L. Swinnen, 2010


33

Remerciements

J’aimerais remercier toutes les personnes qui ont contribué au développement de ce
composant. En particulier, mon collègue
Nicolas Hendrikx
, avec qui j’ai imaginé les grandes
lignes de cet outil, en espérant qu’il sera
apprécié. J’aimerais également remercier les
étudiants qui ont, par leurs intérêts, leurs remarques et leurs souhaits, permis de corriger et
d’améliorer ce composant.



Bibliographie et références

[1]

Bruce Eckel
,
Thinking in Java
, Prentice
-
Hall, 3
rd

editi
on, December 2002,
http://mindview.net/Books/TIJ

Version française disponible sur

:
http://penserenjava.free.fr

[2]

Cay S. Horstmann, Gary Cornell,

Core Java 2

: V
olume 1

Fundamentals
, Sun
Microsystems, 7
th

edition, 2005

[3]

Cay S. Hortsmann, Gary Cornell
,
Core Java 2

: Volume 2 Advanced Features
, Sun
Microsystems, 7
th

editon, 2005





Information de Copyright


Java
TM
, Netbeans
TM

, Oracle
®
, Oracle
®

Database Expres
s Edition are registered trademarks of
Oracle and/or its affiliates. Other names may be trademarks of their respective owners.


Eclipse
©

Copyright Eclipse contributors and others 2000, 2010. All rights reserved. Eclipse
is a trademark of Eclipse Foundati
on Inc.


IntelliJ IDEA
©

2000
-
2010 JetBrains s.r.o. All rights reserved.


Microsoft
®
, Microsoft Windows
®
, Microsoft SQL Server
®

are trademarks of Microsoft
Corporation and/or its affiliates.


Tous les noms et marques des produits cités sont des marques dé
posées par leurs
producteurs respectifs.