Swing

Embed Size (px)

Citation preview

  • 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