swing
TRANSCRIPT
-
7/13/2019 Swing
1/43
Cration interface graphique avec Swing : les bases
Par Baptiste Wicht
Date de publication : 12 juillet 2006
Dernire mise jour : 3 dcembre 2007
Au long de ce tutoriel, nous allons dcouvrir les bases de Swing. C'est--dire comment
afficher une fentre, afficher du texte, demander du texte l'utilisateur, ... Tout au long de
l'article, nous allons appliquer les connaissances que nous verrons sur un petit projet.
http://baptiste-wicht.developpez.com/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
2/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 2 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
1 - Introduction.............................................................................................................................................................3
1.1 - Notre projet....................................................................................................................................................3
2 - Swing......................................................................................................................................................................4
3 - Les fentres........................................................................................................................................................... 5
3.1 - JWindow.........................................................................................................................................................5
3.2 - JDialog........................................................................................................................................................... 7
3.3 - JFrame...........................................................................................................................................................83.4 - Application au projet....................................................................................................................................10
4 - Afficher du texte dans la fentre......................................................................................................................... 12
4.1 - Le positionnement des composants............................................................................................................12
4.2 - Afficher du texte avec un JLabel.................................................................................................................13
4.3 - Application au projet....................................................................................................................................15
5 - Ajouter des boutons dans la fentre................................................................................................................... 17
5.1 - Attribuer une action un bouton.................................................................................................................18
5.1.1 - ActionListener......................................................................................................................................18
5.1.2 - AbstractAction......................................................................................................................................20
5.2 - Application au projet....................................................................................................................................21
6 - Demander du texte l'utilisateur.........................................................................................................................23
6.1 - Utilisation d'un JTextField............................................................................................................................236.2 - Application au projet....................................................................................................................................26
7 - Proposer une liste de choix l'utilisateur............................................................................................................28
7.1 - Deux manires d'utiliser JComboBox..........................................................................................................28
7.1.1 - Mthodes de JComboBox...................................................................................................................28
7.1.2 - Cration d'un modle de liste............................................................................................................. 30
7.2 - Application au projet....................................................................................................................................33
8 - Utiliser des botes de dialogue avec JOptionPane..............................................................................................37
9 - Ajouter une barre de menu votre fentre.........................................................................................................39
10 - Conclusion..........................................................................................................................................................41
10.1 - Remerciements..........................................................................................................................................41
10.2 - Les sources............................................................................................................................................... 41
11 - Annexes..............................................................................................................................................................42
11.1 - Centrer une JFrame avec plusieurs crans.............................................................................................. 42
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
3/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 3 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
1 - Introduction
Vous avez toujours voulu crer une application avec une interface graphique en java, mais vous n'avez pas russi.
Ce tutoriel est fait pour vous. On va y dcouvrir les composants de base d'une interface graphique et comment les
intgrer votre interface et tout cela en utilisant Swing. A la fin de ce tutoriel, vous aurez cr une petite calculatrice,qui pourra vous servir de base vos futurs programmes.
Ce tutoriel est divis en diffrentes petites tapes et la fin de chacune de celles-ci, vous pouvez tlcharger le
code source de l'tape pour toujours avoir une base de comparaison en cas d'erreur. Vous pouvez aussi tlcharger
l'intgralit des sources la fin du tutoriel.
Cet article n'est pas destin couvrir la totalit de Swing. Il vous prsentera les bases du framework, il sera complt
termes par d'autres articles plus pousss sur des sujets prcis.
1.1 - Notre projet
Le projet que nous allons dvelopper tout au long de ce tutoriel est trs simple. C'est une petite calculette permettant
de faire des additions, des soustractions, des multiplications et des divisions et tout cela avec 2 nombres. On utilisera
une fentre pour afficher cette calculatrice.
Au niveau de l'interface que nous devrons dvelopper, elle consistera donc en une fentre contenant 5 champs :
Un champ pour saisir le premier nombre
Un champ pour saisir le deuxime nombre
Une liste pour choisir l'oprateur
Un bouton pour effectuer le calcul
Un champ pour afficher le rsultat du calcul
Nous avancerons le projet au fur et mesure que nous apprendrons manipuler les composants d'une interface
graphique.
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
4/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 4 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
2 - Swing
Tout au long de cet article, nous allons utiliser le framework graphique Swing. Mais qu'est-ce que ce Swing et pourquoi
utiliser celui-l plutt qu'un autre ?
Pour comprendre ce qu'est Swing, on va remonter un peu plus loin, au dbut de Java. Swing n'existait pas encore.On utilisait alors AWT pour crer des interfaces graphiques. AWT utilise directement les composants du systme.
Cela permet d'tre rapide puisque c'est le systme qui s'occupe de la cration. Nanmoins, Java se voulant portable,
on est oblig de limiter les composants AWT aux composants qu'on trouve sur tous les systmes d'exploitation. On
ne trouvait donc pas de tableau ni d'arbre.
C'est pour pallier ce manque de composants que Swing a t introduit dans Java 1.2. Cette fois, les composants
sont entirement dessins en Java, on peut donc crer autant de composants que l'on veut. C'est grce cela qu'on
peut trouver maintenant un tableau ou un arbre dans les interfaces graphiques en Java. Nanmoins, Swing a t
critiqu dans ses dparts pour sa lenteur par rapport AWT, en effet, cette fois, Java doit tout dessiner lui-mme
ce qui est logiquement plus lent que de demander au systme d'afficher un composant. Mais depuis sa premire
version Swing a t trs largement amlior pour tre maintenant une librairie trs rapide et trs complte. On peut
noter que tous les composants Swing (reconnaissables leur nom prfixs par J) hritent des composants AWT.
Dans les frameworks concurrents, on peut encore citer SWT. Il se situe entre AWT et Swing. C'est--dire qu'il utilise les
composants systmes, mais quand un composant n'existe pas sur le systme, il l'emule en le dessinant directement.
Le dsavantage, c'est donc qu'on a une librairie SWT pour chaque systme.
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
5/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 5 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
3 - Les fentres
Il existe plusieurs types de fentres dans Swing :
JWindow: C'est la fentre la plus basique. C'est juste un conteneur que vous pouvez afficher sur
votre cran. Il n'a pas de barre de titre, pas de boutons de fermeture/redimensionnement et n'est pasredimensionnable par dfaut. Vous pouvez bien sr lui ajouter toutes ces fonctionnalits. On utilise surtout les
JWindow pour faire des SplashScreen, c'est--dire des interfaces d'attente qui se ferment automatiquement.
JDialog: C'est une fentre destine aux botes de dialogue. Ce type de fentre peut tre modal, c'est--
dire qu'elle bloque une autre fentre tant qu'elle est ouverte. Elles sont destines travailler de pair avec la
fentre principale que nous allons voir maintenant.
JFrame: C'est une fentre destine tre la fentre principale de votre application. Elle n'est dpendante
d'aucune autre fentre et ne peut pas tre modale. Elle a une barre de titre et peut accueillir une barre de
menu. Elle possde un bouton de fermeture, un bouton de redimensionnement et un bouton pour l'iconifier.
Nous allons maintenant voir comment crer ces fentres sans trop entrer dans les dtails pour cet article.
3.1 - JWindow
Nous allons maintenant crer une simple JWindow qui ne fait rien pour le moment. Comme tel, a n'est pas trs utile,
mais cela vous montrera quoi ressemble une telle fentre.
Voici donc le code minimal ncessaire la cration d'une JWindow :
JWindow window =newJWindow();
On s'est donc juste content d'instancier une nouvelle JWindow. Maintenant pour l'afficher, on va utiliser la mthode
setVisible qui vient de la classe Component et qui sera donc la mme pour toutes les sortes de fentres.
SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){ //On cre une nouvelle instance de notre JWindow JWindow window =newJWindow();window.setSize(300, 200);//On lui donne une taille pour qu'on puisse la voir
window.setVisible(true);//On la rend visible}});
Comme vous pouvez le voir, c'est un peu plus compliqu que ce qu'on pense, mais rassurez-vous, vous allez vite
comprendre quoi sert tout ce code. En plus, certains me diront que a marche sans tout a. Oui, en effet, a marche
sans a, mais dans ce tutoriel nous allons tout de suite apprendre la bonne faon de faire et c'est celle-ci
Alors, pourquoi tout ce code ? Pour une raison bien simple, Swing utilise son propre thread de traitement, qu'on
appelle l'EDT (Event Dispatch Thread). C'est--dire que dans chaque application, on a 2 threads (au minimum), un
thread pour le programme en lui-mme et un thread pour Swing. La rgle est simple, on ne fait rien de graphique
dans le thread principal et on ne fait rien d'autres que du graphique dans le thread Swing. On cre donc une tche
(Runnable) contenant le code ddi la cration de la fentre et on l'ajoute dans le thread de Swing.
Un thread, c'est quoi ?Vous pouvez vous reprsentez un thread comme un fil d'xcution.
C'est--dire une sorte de tube contenant des instructions effectuer. Quand vous voulez faire
quelque chose dans le thread de Swing, vous allez rajouter un nouvel lment dans le tube et
il va tre excut quand ce sera son tour.
Pourquoi ne faut-il pas mlanger les deux ? Parce que si nous xcutons une action longue dans l'EDT, nous
bloquerons ce dernier et l'interface va tre fige jusqu' la fin de cette action. Tandis que si nous sparons les deux,on a notre action en tche de fond et notre interface qui est toujours ractive.
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
6/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 6 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Je ne vais pas m'tendre plus longtemps sur le sujet, si vous voulez plus d'informations, je vous invite consulter
cet excellent article : Threads et performance avec swing.
On va maintenant mettre notre code dans une mthode main :
publicclassTestJWindow {
publicstaticvoidmain(String[] args) { SwingUtilities.invokeLater(newRunnable(){ publicvoidrun(){ //On cre une nouvelle instance de notre JWindow JWindow window =newJWindow(); window.setSize(300, 200);//On lui donne une taille pour qu'on puisse la voir window.setVisible(true);//On la rend visible } });}}
Mais on ne va pas le laisser tel quel, car sinon, on ne pourrait pas fermer notre programme. On va donc rajouter
une attente de 5 secondes ensuite fermer le programme. Pour ceux qui ne le savent pas, pour attendre un certain
temps, on utiliser la mthode statique sleep de la classe Thread et pour quitter le programme, on utilise la mthodeexit de la classe System :
publicclassTestJWindow {publicstaticvoidmain(String[] args) { SwingUtilities.invokeLater(newRunnable(){ publicvoidrun(){ //On cre une nouvelle instance de notre JWindow JWindow window =newJWindow(); window.setSize(300, 200);//On lui donne une taille pour qu'on puisse la voir window.setVisible(true);//On la rend visible } });try
{Thread.sleep(5000); }catch(InterruptedException e) {}System.exit(0);
}}
Et voici le rsultat :
JWindow
http://gfx.developpez.com/tutoriel/java/swing/swing-threading/http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
7/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 7 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Comme vous le voyez, en l'tat ce n'est pas trs beau... C'est pour a qu'il est assez rare de les utiliser, mis part
pour faire un cran de dmarrage ou des fentres trs personnaliss. Mais rassurez-vous, nous allons tout de suite
passer quelque chose de plus commun et de plus utile.
Le code complet : TestJWindow
3.2 - JDialog
Passons maintenant une JDialog. Encore une fois, nous allons crer une fentre toute vide, nous apprendrons plus
loin comment faire pour ajouter quelques choses dans cette fentre.
Voil donc le code minimal pour crer une JDialog avec un titre :
JDialog dialog =newJDialog();dialog.setTitle("Premire fentre"); //On lui donne un titre
C'est une nouvelle fois tout simple, non ?
On remet notre code dans un main :
publicclassTestJDialog {publicstaticvoidmain(String[] args){ SwingUtilities.invokeLater(newRunnable(){ publicvoidrun(){ //On cre une nouvelle instance de notre JDialog JDialog dialog =newJDialog(); dialog.setSize(300, 200);//On lui donne une taille dialog.setTitle("Premire fentre"); //On lui donne un titre dialog.setVisible(true);//On la rend visible
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix } });}}
Vous pouvez voir que c'est trs ressemblant au code de la JWindow. Le principe reste en effet le mme pour toutes
les fentres.
Voici donc ce que vous donne ce code :
JDialog
Le rsultat est dj plus proche d'une fentre qu'on rencontre habituellement.
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/TestJWindow.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
8/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 8 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
En gnral, on n'utilise pas directement la classe JDialog comme a. On passe souvent par la classe JOptionPane
qui permet de crer des boites de dialogue trs facilement. Nous verrons cela au chapitre 8.
Le code complet : TestJDialog
3.3 - JFrame
Passons maintenant la fentre la plus complte et celle qui va nous intresser le plus, la JFrame.
Cette fois, on ne va pas crer directement une instance de JFrame, mais on va crer une nouvelle classe hritant
de JFrame. C'est--dire un nouveau type de JFrame si vous prfrez. Il ne faut bien sr pas oublier d'importer la
classe JFrame.
Ainsi, vous pourriez faire quelque chose dans ce got-l :
importjavax.swing.JFrame;
publicclassSimpleFenetre extendsJFrame{publicSimpleFenetre(){ super();}}
Sauf qu'ainsi, on n'afficherait rien du tout, il va donc falloir ensuite configurer cette fentre pour qu'elle fasse ce que l'on
veut. Pour cela, on va crer une mthode qui va initialiser notre fentre et appeler celle-ci depuis notre constructeur.
Voici donc ce quoi va ressembler notre fentre :
importjavax.swing.JFrame;
publicclassSimpleFenetre extendsJFrame{publicSimpleFenetre(){ super();build();//On initialise notre fentre
}privatevoidbuild(){ setTitle("Ma premire fentre"); //On donne un titre l'application setSize(320,240); //On donne une taille notre fentre setLocationRelativeTo(null); //On centre la fentre sur l'cran setResizable(false); //On interdit la redimensionnement de la fentre setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix}
}
Voici ce que font les diffrentes mthodes que l'on vient d'utiliser :
setTitle(String title): Cette mthode modifie le titre de la fentre. Ce titre va apparatre dans la barre de titre
et galement dans la barre des tches.
setSize(int width, int height): Cette mthode permet de modifier la taille de la fentre. On verra plus tard
qu'il y une autre faon de faire pour changer la taille de la fentre, mais cette deuxime faon n'est utile que
pour les fentres non vides.
setLocationRelativeTo(Component c): Cette mthode permet de positionner la fentre par rapport un
composant. En indiquant un composant null, elle va se placer automatiquement au milieu de l'cran.
setResizable(boolean resizable): Cette mthode permet ou non le redimensionnement de la fentre.
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/TestJDialog.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
9/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 9 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
setDefaultCloseOperation(int operation): Cette mthode permet de configurer l'action qui va tre xcute
lors de la fermeture de la fentre. On peut choisir de faire quitter le programme, de fermer la fentre ou de la
rendre invisible (ce qui n'est pas pareil)
La mthode setLocationRelativeTo(null) pour centrer une fentre ne fonctionne pas avec
plusieurs crans. Elle va en effet centrer la fentre au milieu des deux crans. Ce n'est pas un
bug car elle positionne la fentre au milieu de l'espace affichable, mais ce n'est pas pratique.Si vous tes dans un tel cas, je vous laisser consulter l'annexe la fin de cet article.
Avec ces mthodes, vous devriez pouvoir commencer crer vos propres fentres. Il existe bien sr encore bien
d'autres choses que l'on peut faire avec les fentres, mais ce n'est pas l'objet de cet article.
On va crer une classe (TestJFrame) qui va nous permettre de lancer notre code maintenant :
publicclassTestJFrame {publicstaticvoidmain(String[] args){ SwingUtilities.invokeLater(newRunnable(){ publicvoidrun(){ //On cre une nouvelle instance de notre JDialog SimpleFenetre fenetre =newSimpleFenetre(); fenetre.setVisible(true);//On la rend visible } });}}
A nouveau le code est semblable celui des autres fentres, sauf que cette fois-ci on n'instancie pas directement
un fentre Swing mais notre propre fentre.
Et voici ce que donne le code que l'on a dvelopp :
JFrame
La seule diffrence visuelle avec la JDialog est le nombre de boutons. Sur la JDialog on n'a que le bouton de fermeture
alors qu'avec la JFrame, on peut minimiser la fentre ou la rduire dans la barre des tches.
Code complet :
TestJFrame
SimpleFenetre
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/TestJFrame.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/SimpleFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/TestJFrame.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
10/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 10 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
3.4 - Application au projet
Maintenant que l'on sait crer une fentre, on va commencer notre projet de calculatrice. La fentre que l'on doit
dvelopper est la fentre principale de notre application. On va donc utiliser une JFrame. Pour le moment, on va
fixer la taille de notre JFrame 400 sur 200, on l'adaptera plus tard en fonction de nos composants. Cette fentre
portera comme titre "Calculatrice", sera centre l'cran, ne sera pas redimensionnable et fermera l'application lorsde la fermeture de la fentre.
Essayez de rflchir la solution avant de regarder. C'est vraiment trs simple, mais c'est toujours mieux si c'est
vous qui le faites.
Voici ce que pourrait donner notre code :
importjavax.swing.JFrame;publicclassCalculatriceFenetre extendsJFrame{publicCalculatriceFenetre(){
super();build();//On initialise notre fentre
}privatevoidbuild(){ setTitle("Calculatrice"); //On donne un titre l'application setSize(400,200); //On donne une taille notre fentre setLocationRelativeTo(null); //On centre la fentre sur l'cran setResizable(false); //On interdit la redimensionnement de la fentre setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix}}
Comme vous le voyez, je n'ai pas mis de mthode main dans cette classe. On va en effet mettre cette mthode dans
une classe lanceur qui sera la classe principale. Pensez toujours correctement sparer les responsabilits de vosobjets dans des classes diffrentes. On va donc crer une classe Calculatrice qui va lancer notre fentre :
publicclassCalculatrice {publicstaticvoidmain(String[] args){ SwingUtilities.invokeLater(newRunnable(){ publicvoidrun(){ CalculatriceFenetre fenetre =newCalculatriceFenetre(); fenetre.setVisible(true); } });}}
Et une fois cette classe lance, vous devriez voir notre application se lancer :
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
11/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 11 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Notre calculatrice
Elle est encore toute simple et ne contient rien, mais on a dj la fentre qui s'affiche.
Code complet :
Calculatrice
CalculatriceFenetre
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/CalculatriceFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/fenetres/Calculatrice.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
12/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 12 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
4 - Afficher du texte dans la fentre
Maintenant que l'on sait comment crer des fentres, il va bien falloir mettre quelque chose dedans, on va donc
commencer par apprendre afficher du texte dans une fentre.
Il y a deux sortes de composants textes dans une interface graphique :
Les composants de saisie : Ce sont les composants qui permettent l'utilisateur de saisir du texte. On va les
dcrire plus loin.
Les composants d'affichage : Ce sont les composants qui permettent d'afficher du texte. Ce sont sur ceux-l
qu'on va se concentrer. Je dis ceux-l, mais en fait, on ne va en utiliser qu'un.
Le composant pour afficher du texte en Java s'appelle un JLabel. C'est juste un composant sans relle apparence
qui affiche un texte.
Mais avant d'utiliser un JLabel, on va commencer par apprendre comment ajouter des composants dans une fentre.
En fait, on ne va pas ajouter directement des composants dans la fentre. Je m'explique : Une Jframe est dcoupe en
plusieurs parties : la fentre, le RootPane, le LayeredPane, la MenuBar, le ContentPane et le GlassPane. Pas besoinde s'affoller, on n'aura pas besoin de tout manipuler. Le RootPane est le container principal, c'est lui qui contient les
autres, le LayeredPane forme juste un panneau compos du ContentPane et de la barre de menu (MenuBar) et le
GlassPane est une couche par dessus le tout qui est utilise pour intercepter les actions de l'utilisateur avant qu'elles
ne parviennent aux composants. Et finalement, il nous reste le ContentPane qui est le composant qui contient la
partie utile de la fentre, c'est--dire, celle dans laquelle on va afficher nos composants.
En Swing, on peut dire qu'il y deux types de composants, les containers et les composants. Les containers sont
destins contenir d'autres containers et composants et les composants sont destins quelque chose de prcis,
par exemple afficher du texte ou permettre l'utilisateur de saisir du texte. Le ContentPane est donc un container
et le JLabel un composant.
Pour ajouter des composants dans la fentre, on va donc crer notre propre JPanel, ajouter notre JLabel l'intrieuret ensuite indiquer la fentre que notre JPanel sera le contentPane.
On va maintenant passer un chapitre suivant qui va traiter du positionnement des composants.
4.1 - Le positionnement des composants
Avant d'apprendre ajouter des composants dans notre JPanel, on va voir comment Java permet de positionner les
composants l'intrieur d'un container.
Il y a deux manires de faire ceci :
Le positionnement absolu : On va placer nos composant nous-mme en utilisant un systme de coordonnes
en x et en y. Ce placement qui semble premire vue trs simple, n'est en fait pas pratique du tout. Tout
d'abord, si on veut ajouter des composants, il faut souvent changer une grande partie des coordonnes
des autres composants et ensuite, il est quasi-impossible de faire du contenu redimensionnable avec cette
mthode moins de recalculer les coordonnes de tous les composants chaque redimensionnement. Cette
mthode n'est pas utiliser.
L'utilisation d'un gestionnaire de placement : On peut aussi utiliser les gestionnaires de placements (layout)
qui vont s'occuper de placer correctement nos composants dans la fentre en fonction des paramtres qu'on
leur a donn pour certains et bien videmment en fonction des composants eux-mmes. C'est cette solution
que nous dvelopper maintenant. Elle se rvle bien plus souple et bien plus pratique que le positionnement
absolu.
Il existe de nombreux gestionnaires de layout dans Swing, en voici quelques uns :
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
13/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 13 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
FlowLayout : C'est le layout par dfaut des panels dans Swing. Il place les composants sur une ligne et
recommence une nouvelle ligne chaque fois qu'il atteint la fin de la ligne.
BorderLayout : Ce layout place les composants dans 5 zones du container : La zone du haut, la zone du
bas, la zone de gauche, celle de droite et la zone du centre. Il est trs utile pour grer le positionement du
contentpane.
CardLayout : Ce layout place les composants sur des couches disposes les unes sur les autres. On ne peut
voir qu'une couche la fois. On utilise surtout ce layout quand on a une srie de composants qui s'affichenten fonction de quelques choses (liste droulante, boutons, ...).
GridLayout : Ce composant place les composants dans une grille. Il va redimensionner les composants
pour les rendre tous de la mme taille. C'est surtout utile quand on a plusieurs boutons ou champs texte en
colonne et ligne qui doivent avoir la mme taille, par exemple, les boutons d'une calculatrice.
GridBagLayout : C'est le layout le plus avanc et le plus puissant. Nanmoins, c'est galement le plus
complexe utiliser. Il permet de positionner les composants dans une grille et il permet d'indiquer beaucoup
de donnes pour indiquer comment placer tel composant dans la grille. Ainsi on pourra dire un composant
de se redimensionner en hauteur mais pas en largeur et lui mettre des marges gauche et droite.
Il y a encore d'autres layouts dans Java et on peut galement en trouver d'autres sur Internet.
Je ne vais pas dtailler tous les gestionnaires de placements dans cet article. Ce n'est pas le but de cet article, je leferai peut-tre dans un prochain article. Pour le moment, on va rester avec le FlowLayout qui est trs simple utiliser.
4.2 - Afficher du texte avec un JLabel
Maintenant que l'on sait tout ce qu'il faut, on va afficher du texte dans notre fentre. Pour faire simple, on va afficher
un message de bienvenue dans notre fentre.
Pour commencer, on va donc crer un JPanel et lui indiquer quel layout utiliser :
JPanel panel =newJPane();panel.setLayout(newFlowLayout());
Rien de compliqu pour le moment, donc.
On va ensuite ajouter dans ce panel notre JLabel de bienvenue :
JLabel label =newJLabel("Bienvenue dans ma modeste application");panel.add(label);
On a donc pass la chane afficher au constructeur de JLabel. On aurait aussi pu utiliser la mthode setText pour
indiquer au JLabel le texte afficher.
On peut afficher du texte multiligne dans un JLabel avec de l'HTML. Il suffit pour cela de mettre
un texte comme celui-ci : "Ligne 1
Ligne 2"On a ensuite utilis la mthode add pour ajouter le label dans le panel. Ensuite le gestionnaire de placement se
chargera du reste. Comme vous pouvez le voir, c'est un jeu d'enfant.
On va maintenant reprendre le code la premire fentre qu'on fate, qu'on va renommer en FenetreTexte. On
pourrait modifier le contentpane directement dans le constructeur, dans le build() ou dans une mthode part.
Personnellement, je fais une mthode part qui cre et qui me renvoie le panel et je l'appelle depuis la mthode
build. Voil donc ce que a nous donnerait :
importjavax.swing.JFrame;publicclassFenetreTexte extendsJFrame{
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
14/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 14 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
publicFenetreTexte(){ super();build();//On initialise notre fentre
}privatevoidbuild(){ setTitle("Fentre qui affiche du texte"); //On donne un titre l'application setSize(320,240); //On donne une taille notre fentre setLocationRelativeTo(null); //On centre la fentre sur l'cran setResizable(true); //On permet le redimensionnement setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix setContentPane(buildContentPane());}}
La seule chose qui ait vraiment chang est le fait qu'on appelle la mthode buildContentPane pour modifier le
ContentPane. J'ai galement modifi le titre et permis le redimensionnement pour que vous voyiez comment se
comporte le FlowLayout.
On va maintenant coder notre mthode buildContentPane() avec ce qu'on a appris avant :
privateJPanel buildContentPane(){JPanel panel =newJPanel();panel.setLayout(newFlowLayout());JLabel label =newJLabel("Bienvenue dans ma modeste application");panel.add(label);returnpanel;}
Cette fois-ci, on va directement ajouter la mthode main dans la classe Fenetre pour avoir moins de classes :
Si on met cette mthode dans FenetreTexte et qu'on la lance, voici ce que a devrait vous donner :
Affichage de texte
Le texte s'ajoute donc automatiquement sur la premire ligne de notre fentre.
Code complet : FenetreTexte
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/texte/FenetreTexte.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/texte/FenetreTexte.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/texte/FenetreTexte.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
15/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 15 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
4.3 - Application au projet
Comme vous l'avez vu, c'est vraiment trs simple d'afficher du texte dans une JFrame. On va maintenant afficher
du texte dans notre Calculatrice. Pour le moment, comme rien d'autre n'est fait, on va juste afficher "Rsultat : Pas
encore calcul". De plus, on va mettre un fond blanc notre fentre plutt que ce gris triste qui apparat par dfaut.
Pour cela, on va utiliser la mthode setBackground(Color) sur notre JPanel.
Voici donc ce que donnerait notre classe modifie :
importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JLabel;publicclassCalculatriceFenetre extendsJFrame{publicCalculatriceFenetre(){ super();build();//On initialise notre fentre
}privatevoidbuild(){ setTitle("Calculatrice"); //On donne un titre l'application setSize(400,200); //On donne une taille notre fentre setLocationRelativeTo(null); //On centre la fentre sur l'cran setResizable(false); //On interdit la redimensionnement de la fentre setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //On dit l'application de se fermer lors du clic sur la croix setContentPane(buildContentPane());}privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout()); panel.setBackground(Color.white);
JLabel label =newJLabel("Rsultat : Pas encore calcul");panel.add(label);
returnpanel;
}}
On a galement chang la couleur de fond de notre JPanel pour que le rsultat soit plus joli.
La classe Calculatrice ne change pas. Voici donc notre calculatrice en l'tat :
Notre calculatrice
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
16/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 16 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Vous pouvez maintenant essayer de modifier les diffrents paramtres que nous avons dfinis pour ce label et essayer
d'ajouter d'autres JLabel votre fentre pour vous familiariser avec ce composant, qui reste trs simple et basique.
TestJFrame
SimpleFenetre
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/texte/SimpleFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/texte/TestJFrame.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
17/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 17 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
5 - Ajouter des boutons dans la fentre
La principale fonctionnalit d'une application graphique est la programmation vnementielle, c'est--dire le fait
que l'utilisateur puisse dclencher des vnements et ragir ce qui se passe dans la fentre. Au contraire d'un
programme en mode console, dans lequel le programme rgit les actions de l'utilisateur sa guise.
Pour que l'utilisateur puisse interagir avec le programme, on dispose par exemple, des boutons. Vous allez donc
apprendre dans ce chapitre, vous en servir.
Mais qu'est-ce qu'un bouton ? C'est tout simplement un lment graphique sur lequel l'utilisateur peut cliquer pour
dclencher une action. Le bouton ne fait rien tant que l'utilisateur n'a pas cliqu dessus.
Le composant pour crer un bouton est le JButton. On va crer une fentre qui comprendra deux boutons.
On va reprendre le code de la classe FenetreTexte (renomm en FenetreBoutons) et l'on va juste s'occuper de la
mthode buildContentPane() pour ajouter 2 boutons la fentre :
importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JButton;publicclassFenetreAvecBouton extendsJFrame{privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout());JButton bouton =newJButton("Cliquez ici !");
panel.add(bouton);JButton bouton2 =newJButton("Ou l !");
panel.add(bouton2);
returnpanel;}}
Vous devriez donc avoir un affichage comme celui-ci :
Utilisation de boutons
C'est bien beau, vous me direz, mais le bouton ne fait rien... C'est normal, on va devoir lui attribuer une action. Nous
verrons cela au chapitre qui suit.
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
18/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 18 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
5.1 - Attribuer une action un bouton
On va maintenant apprendre attribuer une action un bouton. C'est--dire indiquer ce qui va devoir se passer
en cas de clic.
Le fonctionnement des actions en Swing suit toujours le mme principe, celui des vnements et des couteurs.Donc lors du clic sur un bouton, on aura donc un vnement (ActionEvent dans ce cas) qui sera envoy tous les
couteurs du bouton. Donc si on veut savoir quand se passe l'action d'un bouton, il faut mettre un couteur sur ce
bouton et ragir en cas d'vnement.
Il y a 2 faons de faire avec un bouton :
Utiliser une classe qui implmente ActionListener et couter le bouton : Cette mthode est toute simple. Il faut
avoir une classe implmentant ActionListener et l'ajouter comme couteur aux boutons. Ensuite, chaque
clic, la mthode actionPerformed va tre appele et il faudra tester le bouton qui a envoy l'vnement, ce
qui n'est pas trs pratique avec un grand nombre de boutons.
Utiliser une AbstractAction : Cette classe reprsente une action de Swing. On peut lui donner un texte
et une icne et on peut videmment lui dire que faire en cas de clic dans la mthode actionPerformed.Personnellement, je prfre cette mthode qui permet de bien sparer l'action du composant graphique, mais
c'est un choix personnel.
On va maintenant essayer les 2 techniques.
Code complet : FenetreBoutons
5.1.1 - ActionListener
On va reprendre la classe FenetreBoutons et la renommer FenetreBoutonsListener.
On va commencer par la mthode base d'ActionListener. La premire chose faire est de dire que la
FenetreBoutonsListener est un listener d'actions. Comment faire a ? Tout simplement en implmentant l'interface
ActionListener et en redfinissant la mthode actionPerformed :
importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JButton;importjava.awt.event.ActionListener;publicclassFenetreBoutonsListener extendsJFrame implementsActionListener{//...privateJPanel buildContentPane(){
JPanel panel =newJPane(); panel.setLayout(newFlowLayout());JButton bouton =newJButton("Cliquez ici !");
panel.add(bouton);JButton bouton2 =newJButton("Ou l !");
panel.add(bouton2);returnpanel;
}publicvoidactionPerformed(ActionEvent e) {}
}
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
19/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 19 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Ensuite, on va dire aux boutons que la fentre va couter leurs actions :
JButton bouton =newJButton("Cliquez ici !");bouton.addActionListener(this);panel.add(bouton);JButton bouton2 =newJButton("Ou l !");
bouton2.addActionListener(this);panel.add(bouton2);
On a donc ajout un couteur au bouton avec la mthode addActionListener. Maintenant chaque fois qu'on va
cliquer sur un bouton, l mthode actionPerformed va tre appele. Vous pouvez vrifier en ajoutant cela dans la
mthode actionPerformed :
System.out.println("Clic");
Vous verrez donc apparatre "Clic" dans la console chaque clic.
Mais, comme fait-on pour diffrencier les deux boutons ? En fait, ce n'est pas trs compliqu, mais a va ncessiter
quelques changements. On va en effet devoir comparer la rfrence de la source de l'vnement avec nos boutonspour savoir qui a lanc l'vnement :
importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JButton;importjava.awt.event.ActionListener;publicclassFenetreAvecBouton extendsJFrame implementsActionListener{privateJButton bouton;privateJButton bouton2;//...
privateJPanel buildContentPane(){ JPanel panel =newJPane(); panel.setLayout(newFlowLayout());bouton =newJButton("Cliquez ici !");
panel.add(bouton);bouton2 =newJButton("Ou l !");
panel.add(bouton2);returnpanel;
}publicvoidactionPerformed(ActionEvent e) { Object source =e.getSource();if(source ==bouton){
System.out.println("Vous avez cliqu ici."); }elseif(source ==bouton2){ System.out.println("Vous avez cliqu l.");}
}}
Vous aurez cette fois un message diffrent en fonction du bouton. Vous pouvez tester avec plus de boutons, a va
marcher aussi. Mais le code de la mthode actionPerformed deviendra vite lourd s'il y a trop de boutons diffrents.
On va maintenant passer la deuxime technique. Elle ncessite un peu plus de code, mais je la considre plus
propre et plus claire.
Code complet : FenetreBoutonsListener
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/FenetreBoutonsListener.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
20/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 20 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
5.1.2 - AbstractAction
On va reprendre la classe FenetreBoutons et la renommer FenetreBoutonsActions.
Nous allons maintenant passer la deuxime mthode : l'utilisation d'AbstractAction. Une AbstraAction est un
ActionListener qui nous permet de grer non seulement l'action gnre par le composant mais aussi le texte, l'icneet l'tat du composant. Par l'tat, je veux dire activ/dsactiv. En plus, on peut utiliser une action pour les lments
du menu comme pour les boutons ou alors les JToolbar. Donc si on a un bouton et un lment de menu qui font la
mme chose, il suffit d'utiliser la mme action.
La classe AbstractAction est une implmentation abstraite d'Action qui nous vite de devoir implmenter toutes les
mthodes d'Action. On va donc utiliser cette classe.
Maintenant, pour ajouter une Action un programme, on peut soit crer une nouvelle classe dans un nouveau fichier
soit crer une classe interne soit utiliser une classe anonyme. On va utiliser la premire solution qui mon avis, la
plus approprie.
Crons donc une classe IciAction pour notre bouton 1 :
publicclassIciAction extendsAbstractAction {publicIciAction(String texte){ super(texte);}publicvoidactionPerformed(ActionEvent e) {System.out.println("Vous avez cliqu ici");
}}
Tout ce qu'on a eu faire, c'est redfinir la mthode actionPerformed et crer un constructeur qui prend un texte en
paramtre pour pouvoir lui passer le texte du bouton. Faisons de mme pour le deuxime bouton :
publicclassLaAction extendsAbstractAction {publicLaAction(String texte){ super(texte);}publicvoidactionPerformed(ActionEvent e) {System.out.println("Vous avez cliqu l");
}}
On pourrait aussi directement indiquer le texte de l'action dans le constructeur de l'action sans
le demander en paramtre, mais cela limiterait un peu la classe, le texte pouvant tre diffrent
en fonction d'ou on met l'action.
Et maintenant, on va attribuer ces actions nos boutons. Pour cela rien de plus, il suffit de passer l'action au
constructeur du JButton :
importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JButton;importjava.awt.event.ActionListener;publicclassFenetreBoutonsActions extendsJFrame implementsActionListener{privateJPanel buildContentPane(){ JPanel panel =newJPane(); panel.setLayout(newFlowLayout());
JButton bouton =newJButton(newIciAction("Cliquez ici !"));
panel.add(bouton);
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
21/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 21 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
JButton bouton2 =newJButton(newLaAction("Ou l"));
panel.add(bouton2);returnpanel;
}}
Comme vous le voyez c'est trs simple et personnellement, je trouve cela bien plus claire que la mthode avec
l'ActionListener unique, mais c'est vous de juger. Le dsavantage tant qu'il faut crer autant de classe que de
boutons, mais le nombre de classe n'tant pas limites, est-ce bien important ?
Dans un tel cas, on aurait pu crer une seule action qui prend en paramtre ce qu'il faut afficher
dans la console pour viter d'tre trop redondant au niveau du code.
Code complet :
IciAction
LaAction
FenetreBoutonsActions
5.2 - Application au projet
Maintenant que nous avons appris utiliser des boutons et leur attribuer une action, nous allons appliquer cela
notre application en y ajoutant un bouton "Calculer".
On va donc crer une classe "CalculAction" qui sera vide pour le moment :
publicclassCalculAction extendsAbstractAction {privateCalculatriceFenetre fenetre;publicCalculAction(CalculatriceFenetre fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {//Action lors du clic sur le bouton calculer
}}
On a juste mis en paramtre de l'action la rfrence vers la fentre pour que l'action puisse aller chercher des infos
dans la fentre.
Et on va maintenant ajouter un bouton avec cette action dans notre fentre :
//...importjavax.swing.JButton;publicclassCalculatriceFenetre extendsJFrame {//...privateJPanel buildContentPane(){ JPanel panel =newJPane(); panel.setLayout(newFlowLayout()); panel.setBackground(Color.White);
JButton bouton =newJButton(newCalculAction(this, "Calculer"));panel.add(bouton);
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/FenetreBoutonsActions.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/LaAction.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/IciAction.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
22/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 22 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
JLabel label =newJLabel("Rsultat : Pas encore calcul");
panel.add(label);
returnpanel;
}}
Ce qui devrait nous donner pour le moment une calculatrice de ce genre qui ne fait encore rien :
Notre calculatrice
Code complet :
CalculAction
Calculatrice
CalculatriceFenetre
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/CalculatriceFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/Calculatrice.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/boutons/CalculAction.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
23/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 23 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
6 - Demander du texte l'utilisateur
Maintenant que vous savez afficher du texte l'cran et employer des boutons pour crer un vnement, on va
apprendre demander l'utilisateur du texte. Pour cela, il existe plusieurs composants :
Le JTextField : C'est le plus simple des composants textes. Il permet d'entrer un texte sur une seule ligne. Le JTextArea : Il permet d'entrer un texte complet sur plusieurs lignes.
Le JEditorPane : Trs complet, vous pouvez modifier la police, la taille, la couleur de votre texte. Il permet
mme d'afficher des pages html. Vous pouvez y insrer du texte et des images.
Le JTextPane : C'est le composant texte le plus volu de Swing. Il permet la mme chose que le
JEditorPane mais il permet galement d'insrer des composant personnaliss, c'est-ire que vous pouvez y
insrer des composants Swing.
On ne va pas s'tendre sur les 3 derniers dans cet article, car cela dpasserait le cadre de celui-ci. J'essayerai de
faire un article ddi pour les composants textes pour complter celui-ci.
Nous allons maintenant apprendre utiliser un JTextField.
6.1 - Utilisation d'un JTextField
On va reprendre la base des autres fentres. Un JTextField s'utilise comme un autre composant, on utilise donc la
mme manire pour l'insrer dans une page. On va donc commencer par ajouter un JTextField dans une fentre :
//...importjavax.swing.JButton;publicclassFenetreSaisie extendsJFrame {//...
privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout());JTextField textField =newJTextField();
textField.setColumns(10); //On lui donne un nombre de colonnes afficherpanel.add(textField);
returnpanel;
}}
Si vous voulez mettre un texte par dfaut dans le JTextField, il suffit de passer une chane de
caractres au constructeur ou alors d'utiliser la mthode setText pour lui donner un texte.
Ce qui devrait vous donner :
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
24/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 24 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Fentre de saisie
Vous pouvez donc crire du texte dans le JTextField. On va maintenant ajouter un bouton notre fentre. Ce bouton
va rcuprer le texte dans le JTextField et l'afficher dans un JLabel qu'on va aussi ajouter l'interface.
Un problme va maintenant se poser. On va devoir faire une nouvelle classe Action pour notre bouton alors comment
rcuprer la valeur du JTextField et modifier la valeur du JLabel ? Dans une application de cette taille, la meilleure
solution est d'ajouter des accesseurs sur notre classe d'interface et passer une rfrence de cette classe notre
action.
On va commencer par modifier notre interface pour ajouter un label et pour pouvoir accder aux deux composants
depuis une autre classe :
//...importjavax.swing.JButton;publicclassFenetreSaisie extendsJFrame {privateJTextField textField;privateJLabel label;//...privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout());textField =newJTextField();
panel.add(textField);
label =newJLabel("Rien pour le moment");
panel.add(label);
returnpanel;
}publicJTextField getTextField(){ returntextField;}publicJLabel getLabel(){ returnlabel;}}
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
25/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 25 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Il serait tentant de juste mettre le modificateur d'accs public pour nos deux champs pour
gnrer moins de code, mais ceci est proscrire. Il faut limiter le plus possible les attributs
publics d'une classe.
Ensuite, on va crer notre GetAction :
publicclassGetAction extendsAbstractAction {privateFenetreSaisie fenetre;publicGetAction(FenetreSaisie fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {String texteUtilisateur =fenetre.getTextField().getText();
fenetre.getLabel().setText(texteUtilisateur);}}
Rien de bien compliqu donc. On passe une rfrence de la fentre au constructeur de l'action et on utilise ensuite
cette rfrence dans la mthode actionPerformed pour rcuprer le texte dans le JTextField avec getText() et modifier
le texte du JLabel avec setText().
On va maintenant ajouter notre bouton notre interface :
//...publicclassFenetreSaisie extendsJFrame {//...privateJPanel buildContentPane(){ JPanel panel =newJPane();
panel.setLayout(newFlowLayout());textField =newJTextField();
panel.add(textField);
label =newJLabel("Rien pour le moment");
panel.add(label);
JButton bouton =newJButton(newGetAction(this, "Changer le texte de place"));
panel.add(bouton);
returnpanel;
}//...}
On a donc pass this (rfrence la classe courante) notre GetAction et on a appliqu cette action sur notre bouton.
Pour finir, voil ce que donne notre petite application :
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
26/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 26 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
Rcupration du texte saisi
La manipulation des textFields est donc trs simple.
Code complet :
GetAction
FenetreSaisie
6.2 - Application au projet
Maintenant que nous savons comment utiliser des JTextField, on va ajouter deux champs textes notre calculatrice.
Voil ce que a va donner :
//...importjavax.swing.JTextField;publicclassCalculatriceFenetre extendsJFrame {privateJTextField field1;privateJTextField field2;//...privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout()); panel.setBackground(Color.white);
field1 =newJTextField(); field1.setColumns(10);panel.add(field1);
field2 =newJTextField();
field2.setColumns(10);panel.add(field2);
JButton bouton =newJButton(newCalculAction(this, "Calculer"));
panel.add(bouton);
JLabel label =newJLabel("Rsultat : Pas encore calcul");
panel.add(label);
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/FenetreSaisie.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/GetAction.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
27/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 27 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
returnpanel;}publicJTextField getField1(){ returnfield1;}publicJTextField getField2(){ returnfield2;}}
Ce qui devrait nous donner l'affichage ceci :
Notre calculatrice
Code complet :
CalculAction
Calculatrice CalculatriceFenetre
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/CalculatriceFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/Calculatrice.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/CalculatriceFenetre.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/Calculatrice.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/saisie/CalculAction.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
28/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 28 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
7 - Proposer une liste de choix l'utilisateur
Aprs avoir vu les champs de texte, on va maintenant voir un nouveau champ de saisie, les listes droulantes. En
Swing, il existe 2 sortes de listes droulantes :
JList, liste droulante assez avance qui permet d'afficher plusieurs lments la fois. JComboBox, c'est une liste droulante normale, de celle que vous voyez partout dans les applications.
On va se contenter d'utiliser la JComboBox dans cet article, la JList sera peut-tre pour plus tard dans un autre article.
7.1 - Deux manires d'utiliser JComboBox
Il existe 2 manires de manipuler des JComboBox, soit on utilise directement les mthodes de manipulations des
lments de la JComboBox soit on dveloppe notre propre modle de liste.
On va maintenant dtailler ces deux mthodes.
7.1.1 - Mthodes de JComboBox
La premire manire de faire, c'est simplement d'utiliser les mthodes que nous propose JComboBox :
addItem(Objet item), cette mthode va ajouter un nouvel objet la liste
removeItem(Objet item), cette mthode va enlever l'objet de la liste
removeAllItems(), cette mthode va vider la liste droulante
getSelectedItem(), cette mthode retourne l'objet qui est actuellement slectionn
Comme vous le voyez, c'est trs simple.
On va maintenant utiliser ces mthodes. Pour cela, on va imaginer une fentre avec plusieurs boutons et 2 listes
droulantes. La premire liste droulante contiendra une srie d'lments qu'on pourra copier dans la deuxime liste
avec un bouton et un deuxime bouton permettra d'enlever des lments de la deuxime liste. On va galement
ajouter un troisime bouton qui permettra de vider la deuxime liste.
On va commencer par crer notre fentre :
importjavax.swing.JComboBox;//...publicclassFenetreListes extendsJFrame {privateJComboBox liste1;
privateJComboBox liste2;//...privateJPanel buildContentPane(){ JPanel panel =newJPanel(); panel.setLayout(newFlowLayout());Object[] elements =newObject[]{"Element 1", "Element 2", "Element 3", "Element 4", "Element 5"};
liste1 =newJComboBox(elements);
panel.add(liste1);
JButton bouton =newJButton(newCopierAction(this, "Copier"));
panel.add(bouton);
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
29/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 29 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
liste2 =newJComboBox(elements);panel.add(liste2);
JButton bouton2 =newJButton(newSupprimmerAction(this, "Enlever"));
panel.add(bouton2);
JButton bouton3 =newJButton(newViderAction(this, "Vider"));
panel.add(bouton3);
returnpanel;
}publicJComboBox getListe1(){ returnliste1;}publicJComboBox getListe2(){ returnliste2;}}
Pour remplir la premire liste, on a donn un tableau d'objets au constructeur du JComboBox qui va se charger de
remplir la liste automatiquement avec les objets du tableau. Pour le reste rien de bien compliqu.
Ce qui devrait nous donner une interface de ce style :
Listes de choix
On va maintenant crer nos 3 actions :
publicclassCopierAction extendsAbstractAction {privateFenetreAvecJComboBox fenetre;publicCopierAction(FenetreAvecJComboBox fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {Object selected =fenetre.getListe1().getSelectedItem();
fenetre.getListe2().addItem(selected);}}
publicclassSupprimmerAction extendsAbstractAction {
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
30/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 30 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
privateFenetreAvecJComboBox fenetre;publicSupprimmerAction(FenetreAvecJComboBox fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {Object selected =fenetre.getListe2().getSelectedItem();
fenetre.getListe2().removeItem(selected);}}
publicclassViderAction extendsAbstractAction {privateFenetreAvecJComboBox fenetre;publicViderAction(FenetreAvecJComboBox fenetre, String texte){ super(texte);this.fenetre =fenetre;
}
publicvoidactionPerformed(ActionEvent e) {fenetre.getListe2().removeAllItems();
}}
La non plus, rien de bien compliqu. On s'est content d'utiliser les mthodes de JComboBox pour faire nos
modifications sur les listes.
On va maintenant passer la seconde faon de faire.
Code complet :
FenetreListes CopierAction
ViderAction
SuprimmerAction
7.1.2 - Cration d'un modle de liste
Cette fois-ci, on ne va pas manipuler directement le JComboBox, mais son modle. En fait, plusieurs composants
Swing utilisent la notion de modle pour stocker leurs donnes. La vue est donc compltement spare des donnes
qui sont stocks dans un modle. En fait quand on utilise les mthodes de JComboBox, on va aussi modifier le
modle, mais par l'intermdiaire de JComboBox. Cette fois-ci, on va crer nos propres modles.
On pourrait tout fait se contenter d'utiliser les modles par dfaut, tant donn que ce qu'on va faire n'est pas trs
compliqu. Mais le but de ce tutoriel est de s'entraner, il n'est donc pas superflu de dcouvrir comment coder ses
propres modles de listes.
Pour crer un modle de liste, il suffit d'hriter de DefaultComboBoxModel. On peut aussi seulement implmenter
ComboBoxModel, mais aprs, il faudra recoder une bonne partie qui est l-mme chaque fois.
Que doit faire le premier modle ? Il ne doit rien faire de spcial. Il n'est pas modifiable et doit juste se contenter
de contenir nos 5 lments. Comme cette classe est destine contenir des chanes de caractres, on va l'appeler
StringModel.
Voil quoi va ressembler notre classe :
ftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/CopierAction.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/FenetreListes.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/SupprimmerAction.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/ViderAction.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/CopierAction.javaftp://ftp-developpez.com/baptiste-wicht/tutoriel/java/swing/bases/fichiers/dvp/swing/bases/listes/FenetreListes.javahttp://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
31/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 31 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
publicclassStringModel extendsDefaultComboBoxModel {privateArrayListstrings;publicStringModel(){ super();strings =newArrayList();
}publicStringModel(String[] strings){ super();this.strings =newArrayList();
for(String string : strings){
this.strings.add(string); }}protectedArrayListgetStrings(){ returnstrings;}publicString getSelectedString(){ return(String)getSelectedItem();}@OverridepublicObject getElementAt(intindex) { returnstrings.get(index);}@OverridepublicintgetSize() { returnstrings.size();}@Override
publicintgetIndexOf(Object element) { returnstrings.indexOf(element);}}
Et voil, rien de plus simple que a ;) On s'est content de redfinir les mthodes ncessaires pour leur dire d'aller
chercher les lments dans notre ArrayList.
On va maintenant passer au deuxime model. Celui-ci est modifiable, on va donc lui ajouter les mthodes addString,
removeString et clearStrings. Comme il a les mmes fonctionnalits de base, on va tendre StringModel et on va
l'appeler ModifiableStringModel. Voil ce que a va donner :
publicclassModifiableStringModel extendsStringModel {publicModifiableStringModel(){ super();}publicModifiableStringModel(String[] strings){ super(strings);}publicvoidclearStrings(){ intoldSize =getStrings().size(); getStrings().clear(); fireIntervalRemoved(this, 0, oldSize);}publicvoidaddString(String string){
getStrings().add(string); intsize =getStrings().size(); fireIntervalAdded(this, size, size);
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com/ -
7/13/2019 Swing
32/43
Cration interface graphique avec Swing : les bases par Baptiste Wicht
- 32 -
Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de
prsentation constitue une uvre intellectuelle protge par les droits d'auteur. Copyright 2009 Baptiste Wicht. Aucune reproduction,
mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts.
htt ://ba tiste-wicht develo ez com/tutoriel/ ava/swin /debutant/
}publicvoidremoveString(String string){ intposition =getStrings().indexOf(string); getStrings().remove(position); fireIntervalRemoved(this, position, position);}}
Cette fois-ci, les mthodes sont un peu compliques. En fait, les mthodes fireXXX permettent d'avertir la liste
droulante qu'il y a eu du changement. Sinon, elle ne pourra pas savoir que les donnes ont changs. C'est le mme
principe que les couteurs sur le bouton. Ici la liste coute son modle pour savoir quand elle doit se mettre jour.
On va maintenant appliquer nos modles. On va reprendre exactement le mme code que pour la mthode
prcdente, mais cette fois, on va initialiser nos deux listes ainsi :
String[] strings =newString[]{"Element 1", "Element 2", "Element 3", "Element 4", "Element 5"};liste1 =newJComboBox(newStringModel(strings));
//...liste2 =newJComboBox(newModifiableStringModel(strings));
On va galement supprimmer les mthodes pour rcuprer les JComboBox et les retourner par des mthodes qui
nous retourne les modles :
publicStringModel getModeleListe1(){return(StringModel)liste1.getModel();}publicModifiableStringModel getModeleListe2(){return(ModifiableStringModel)liste2.getModel();}
Et on peut maintenant passer la modification de nos actions :
publicclassCopierAction extendsAbstractAction {privateFenetreAvecJComboBox fenetre;publicCopierAction(FenetreAvecJComboBox fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {String selected =fenetre.getModeleListe1().getSelectedString();
fenetre.getModeleListe2().addString(selected);}}
publicclassSupprimmerAction extendsAbstractAction {privateFenetreAvecJComboBox fenetre;publicSupprimmerAction(FenetreAvecJComboBox fenetre, String texte){ super(texte);this.fenetre =fenetre;
}publicvoidactionPerformed(ActionEvent e) {String selected =fenetre.getModeleListe2().getSelectedString();
fenetre.getModeleListe2().removeString(selected);}}
http://baptiste-wicht.developpez.com/tutoriel/java/swing/debutant/http://www.developpez.net/forums/u75080/baptiste-wicht/http://www.developpez.com