← (précédent) D.10 Les gestionnaires de mise en forme
D.12 Exercices corrigés 2
Accueil S O M M A I R E

D.11 Exercices corrigés (1)

EXERCICE 1

Ecrire un programme qui permet d'afficher une simple fenêtre avec une taille, un titre et une couleur que vous aurez choisis.
 CORRECTION EXERCICE 1 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreSimpleColoree
5.     {
6.          public static void main (String [] args)
7.          {
8.               JFrame f = new JFrame("fenetre simple");
9.               Container conteneur = f.getContentPane();
10.              conteneur.setBackground(new Color(200, 150, 50) );
11.              f.setSize(200, 100);
12.              f.setDefaultCloseOperation(3);
13.              f.setVisible(true);
14.         }
15.    }

Explications

Ligne 8 : On crée une fenêtre de type JFrame appelée f. On utilise ici le contructeur qui requiert un argument de type String dont la valeur représente le titre de la fenêtre. Ici, , c'est "fenetre simple".

Ligne 9 : On crée un conteneur de type Container. Remarquez, ici, on applique la méthode getContentPane() à l'objet f. Dans nos exemples des chapitres précédents, on écrivait simplement :Container conteneur = getContentPane(); Normal : on créait le conteneur dans le contructeur de la classe servant à créer la fenêtre. On n'avait pas besoin de préciser l'objet fenetre qui, de toutes façons, n'était pas encore créé. On n'aurait pu écrire : Container conteneur = this.getContentPane(); Mais il n'yavait pas d'ambiguité. Ce n'était donc pas necéssaire d'utiliser le mot clé this comme dans this.nom = nom; qui fait la différence entre la variable nom du champ de la classe et la vazriable nom utilisée comme argument du contructeur.

Ligne 10 : on donne au conteneur une couleur qulconque. On utilise la méthode setBackground() qui requiert comme argument, un objet de type Color. Cet objet est crée à l'intérieur même des parenthèses de la méthode setBackground(). Le contructeur de la classe Color requiert 3 argument de type int dont la valeur varie entre 0 et 255.
Remarquez : on aurait pu crée l'objet Color en gardant sa référence. Par exemple : Color c = new Color(200, 150, 50); Puis faire ceci : conteneur.setBackground(c);

Ligne 11 : on donne une taille à la fenêtre en utilisant la méthode setSize() qui requiert 2 argument de type int dont le premier représente la largeur de la fenêtre et le deuxième représente la hauteur de la fenêtre. L'unité est le pixel.

Ligne 12 : On applique à l'objet fenetre f, la méthode setDefaultCloseOperation() pour indiquer ce qui doit se passer lorsqu'on clique sur le coin supérieur droit de la fenêtre dans le but de la fermer. Ici, on utilise la constante EXIT_ON_CLOSE dont la valeur est 3. Ce qui signifie que le programme doit s'arrêter à la fermeture de la fenêtre.

Ligne 13 : la méthode setVisible() appliquée à l'objet fenetre f avec l'argument de type booléen trus permet de rendre visible la fenêtre. Et oui. C'est bien beau de créer la fenêtre. Encore faut-il la rendre visible.
EXERCICE 2

Ecrire un programme qui permet d'afficher une simple fenêtre avec une taille, un titre et une couleur que vous aurez choisis par saisie au clavier
 CORRECTION EXERCICE 2 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreSimpleColoree2
5.     {
6.          public static void main (String [] args)
7.          {
8.               System.out.println("Titre de votre fenetre = "); 
9.               String titre = Lire.chaine(); 
10.              System.out.println("Largeur de votre fenetre = "); 
11.              int largeur = Lire.entierInt(); 
12.              System.out.println("hauteur de votre fenetre = "); 
13.              int hauteur = Lire.entierInt(); 
14.              System.out.println("Quantite de vert de votre fenetre = "); 
15.              int rouge = Lire.entierInt();
16.              System.out.println("Quantite de rouge de votre fenetre = "); 
17.              int vert = Lire.entierInt();
18.              System.out.println("Quantite de bleu de votre fenetre = "); 
19.              int bleu = Lire.entierInt();
20.              
21.              JFrame f = new JFrame(titre);
22.              Container conteneur = f.getContentPane();
23.              conteneur.setBackground(new Color(vert, rouge, bleu) );
24.              f.setSize(largeur, hauteur);
25.              f.setDefaultCloseOperation(3); 
26.              f.setVisible(true);
27.         }
28.    }

Si vous compilez puis exécutez ce programme, il vous sera demandé le nom de la fenêtre. Saisissez le même nom que ci-dessus. Fenetre simple. Il vous sera aussi demandé la largeur de votre fenêtre. Saisissez la valeur 200 comme dans l'exemple ci-dessus. Puis saisissez la hauteur de 100 pixels. Puis la quantité de vert, mettez 200. Puis la quntité de rouge, saisissez 150. Puis la quantité de bleu, saisissez la valeur 50.
Aussitôt, la même fenêtre que dans l'exemple ci-dessus apparaît.

Explications

Pas grand chose à expliquer. De la ligne 21 à la ligne 26, c'est le même code que dans l'exemple ci-dessus. Sauf que les arguments sont sous forme de variable. Les valeurs des variables sont saisies de la ligne 8 à la ligne 19.
EXERCICE 3

Ecrire un programme qui permet d'afficher une simple fenêtre avec une taille, un titre et une couleur. Mais cette fois, la taille et le couleur de la fenêtre seront choisies au hasard.
Pensez à la méthode (static) random() de la classe Math.
Attention ! ! ! : La taille de votre fenêtre ne doit pas dépasser celle de l'écran d'un ordinateur. Pas seulement votre ordinateur. Mais n'importe quel ordinateur.
Pensez à la classe Toolkit
 CORRECTION EXERCICE 3 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreSimpleColoree
5.     {
6.          public static void main (String [] args)
7.          {
8.               Toolkit outil = Toolkit.getDefaultToolkit();
9.               
10.              Dimension ecran = outil.getScreenSize();
11.              
12.              int largeurEcran = ecran.width;
13.              
14.              int hauteurEcran = ecran.height;
15.              
16.              int largeurFenetre = (int) (Math.random() * largeurEcran);
17.              int hauteurFenetre = (int) (Math.random() * hauteurEcran);
18.              
19.             int rouge = (int) (Math.random() * 256);
20.             int vert = (int) (Math.random() * 256);
21.             int bleu = (int) (Math.random() * 256);
22.             
23.             JFrame f = new JFrame("fenetre quelconque");
24.             Container conteneur = f.getContentPane();
25.             conteneur.setBackground(new Color(rouge, vert, bleu) );
26.             f.setSize(largeurFenetre, hauteurFenetre);
27.             f.setDefaultCloseOperation(3); 
28.             f.setVisible(true);
29.         }
30.    }

Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre avec un titre "Fenetre quelconque". La taille de cette fenêtre et sa couleur sont déterminés par le hasard. Pour s'en convaincre, fermez cette fenêtre en cliquant sur le coin supérieur droit. Puis exécutez à nouveau (pas besoin de recompiler). Une fenêtre avec le même titre apparait. Mais la taille et la couleur ont changé.

Explications :

Un objet de la classe Toolkit (créé en ligne 8) à qui on applique la méthode getScreenSize() de la classe Toolkit, permet d'obtenir les dimensions d'un écran. Ecran de PC, de téléphone portable, de console de jeu, bref, de tout écran appartenant à l'objet sur lequel le programme est exécuté.

En ligne 10 : on applique alors à l'objet outil la méthode getScreenSize(). Cette méthode renvoie un objet de type Dimension qu'on met dans la variable ecran.

La variable ecran (créée en ligne 10 donc) est un objet de type Dimension. La classe Dimension (prédéfinie) contient des champs dont 2 d'entre eux sont : width et height.

width et height sont respectivement la largeur et la hauteur de l'écran. C'est pourquoi, la largeur de l'écran (largeurEcran ligne 12) est égale à ecran.with et la hauteur de l'écran (hauteurEcran ligne 14) est égale à ecran.height

La largeur de la fenêtre (variable largeurFenetre créé en ligne 16) a pour valeur un nombre pris au hasard entre zéro et la largeur de l'écran (largeurEcran).
Rappelons que la méthode random() de la classe Math permet d'obtenir un nombre réel pris au hasard entre zéro (inclu) et 1 (exclu). Le fait de multiplier Math.random() par largeurEcran permet d'obtenir un nombre pris au hasard entre zéro (inclu) et la largeur de l'écran (exclue). Donc la fenêtre aura une largeur dont la valeur sera au maximum, celle de la largeur de l'écran moins 1 pixel.

Même raisonnement pour la hauteur de l'écran.

Même raisonnement pour les valeurs de la quantité de rouge (ligne 19), de vert (ligne 20) et de bleu (ligne 21). Ces quantités ont une valeur qui va de zéro à 255. La valeur prise au hasard ira de zéro (inclue) à 256 (exclu)

Pour connaitre les dimensions de l'écran de votre PC, Supprimez le contenu de la fonction main() dans le programme ci-dessus.
Remplacez par les 4 instructions suivantes :

Toolkit t = Toolkit.getDefaultToolkit();
Dimension ecran = t.getScreenSize();
System.out.println("largeur ecran pc = " + ecran.width);
System.out.println("hauteur ecran pc = " + ecran.height);

Il serait intéressant pour vous d'étudier un peu la classe Dimension que vous trouverez dans cette page : classe Dimension java 5.0

Bien entendu si vous ne comprenez rien à l'anglais, ça va être dur.
EXERCICE 4

Ecrire un programme qui permet d'afficher une petite fenêtre (300 pixels fois 300 pixels) qui parcour l'écran du PC de gauche à droite. Pendant son mouvement, la couleur change au hasard, faisant ainsi l'effet d'un jeu de lumières.
Si vous exécutez le programme la nuit, éteignez la pièce dans laquelle vous êtes. Vous apprécierez mieux le résultat.
 CORRECTION EXERCICE 4 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreColoreeEnMouvement
5.     {
6.          public static void main (String [] args)
7.          {
8.               Toolkit outil = Toolkit.getDefaultToolkit();
9.               
10.              Dimension ecran = outil.getScreenSize();
11.              
12.              int largeurEcran = ecran.width;
13.              
14.              int abscisse = 0;
15.              
16.              JFrame f = new JFrame("Fenêtre quelconque");
17.              
18.              deplacerFenetre(f, abscisse, largeurEcran);
19.         }
20.         
21.         public static void deplacerFenetre(JFrame f, int a, int largeurPC)
22.         {
23.             do
24.             {
26.                  int rouge = (int) (Math.random() * 256);
27.                  int vert  = (int) (Math.random() * 256);
28.                  int bleu  = (int) (Math.random() * 256);
29.                  
30.                  Container conteneur = f.getContentPane();
31.                  conteneur.setBackground(new Color(rouge, vert, bleu) );
32.                  f.setBounds(a, 0, 300, 300);
33.                  f.setVisible(true);
34.                  f.setDefaultCloseOperation(3);
35.                  
36.                  try
37.                  {
38.                      Thread.sleep(1000/24);
39.                  }
40.                  catch(InterruptedException e)
41.                  {
42.                      e.printStackTrace();
43.                  }
44.                  f.setVisible(false);
45.                  a++;
46.             }     
47.             while(a < (largeurPC - 300) );
48.             f.setVisible(true);
49.            
49.         }
50.    }

Compilez puis exécutez ce programme, il sera affiché :

une fenêtre de 300 pixels sur 300 pixels en mouvement de la gauche de l'écran de pc vers la droite. Arrivée au bout, elle arrête de bouger.

Explications :

Grâce à la classe Toolkit et à sa méthode getScreenSize(), j'obtiens la largeur de l'écran dont la valeur est mise dans la variable largeurEcran (ligne 12).

Je crée la méthode deplacerFenetre() en ligne 21 permettant de déplacer une fenêtre. Cette méthode requiert 3 arguments : La fenêtre à déplacer, l'abscisse du point où la fenêtre apparaît la première fois, et la largeur de l'écran du pc.

Lignes 26 à 28 : choix de la couleur au hasard.

Ligne 30 : je crée le conteneur dans la fenêtre f. Puis je lui donne une couleur (ligne 31). Les éléments qui colorent ce conteneur (rouge, vert et bleu) sont bien sûr pris au hasard.

Ligne 32 : je fait apparaître la fenêtre grâce à la méthode setBounds() qui requiert 4 arguments : les deux premiers sont l'abscisse et l'ordonnée du point où doit apparaître la fenêtre. L'abscisse ici est une variable car je vais la faire évoluer. L'ordonnée est toujours égale à zéro.
Rappel : l'abscisse est celui du coin supérieur gauche de la fenêtre. Et c'est la distance entre le coin supérieur gauche de l'écran du pc et la droite qui passe par le coin supérieur gauche de la fenêtre graphique.

Lignes 33 et 34 : vous connaissez.

Lignes 36 à 43 : La méthode sleep() de la classe Thread permet d'arrêter le programme pendant un certain temps. Ce temps, en millisecondes, est l'unique argument de la méthode. Ici, j'ai mis 42. Pourquoi 42 ? ... Parce que 1000/24 est égale à 41.6666 et j'ai pris 42 parce que la méthode sleep() requiert un nombre entier. Pourquoi 1000/24 ? ...Voir fin d'explication.

Le programme s'arrête donc pendant 42 millisecondes, puis la fenêtre disparaît (ligne 44 : f.setVisible(false); ).
Puis en ligne 45 : on ajoute 1 à la valeur de a qui l'abscisse du point où doit apparaître la fenêtre.

Nous sommes dans une boucle do...while (lignes 23 à 46). La fenêtre de 300 pixels sur 300 pixels qui apparaît avec une couleur prise au hasard et qui disparaît, va ensuite réapparaitre, mais cette fois, déplacée de 1 pixel (ligne 45 : a++). Et ce, tant que la valeur de a est inférieure à la largeur du PC moins 300. Voir le tant que en ligne 47.

Pourquoi largeur du PC moins 300 ? ... Parce que la largeur de la fenêtre graphique est de 300 pixels et qu'il faut que la fenêtre reste visible en entier à la fin.
Et cette visibilté de la fenêtre après son parcours est due à la ligne 48. Si l'instruction de la ligne 48 n'existait pas, la fenêtre aurait été invisible après son parcours grâce à la ligne 44.

Maintenant, revenons au bloc try...catch. Lignes 36 à 43. Plus précisément, pourquoi 1000/24 ? ...
Le principe du mouvement, c'est comme au cinéma. Pour que la persistance visuelle donne l'impression du mouvement (car ce n'est qu'une impression), il faut que les images apparaissent et disparaissent à raison de 24 par seconde. Or 1 seconde = 1 000 millisecondes. Et 24 images par secondes, cela donne une image par 1000/24 seconde.

Dans le bloc do...while, la fenêtre apparait, puis reste visible 1000/24 seconde, puis disparaît. Puis réapparaît à nouveau puisque do...while est une boucle. La même chose se répète.
EXERCICE 5

Ecrire un programme qui permet d'afficher une petite fenêtre dans laquelle on voit 5 composants graphiques que vous choisirez.
Chacun de ces composants occupe une place précise. En haut, en bas, à gauche, à droite, et enfin au centre.
 CORRECTION EXERCICE 5 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreGestionnaireForme
5.     {
6.          public static void main (String [] args)
7.          {
8.               JFrame f = new JFrame("fenetre simple");
9.               Container conteneur = f.getContentPane();
10.              conteneur.setBackground(new Color(200, 150, 50) );
11.              f.setSize(400, 300);
12.              
13.              JButton bouton = new JButton("bouton");
14.              conteneur.add(bouton, "North");
15.              
16.              JTextArea zoneTexte = new JTextArea();
17.              conteneur.add(zoneTexte, "Center");
18.              
19.              JButton bouton2 = new JButton("bouton2");
20.              conteneur.add(bouton, "South");
21.              
22.              JRadioButton radio = new JRadioButton("radio");
23.              conteneur.add(radio, "East");
24.              
25.              JCheckBox cocher = new JCheckBox("case");
26.              conteneur.add(bouton, "West");
27.               
28.              f.setDefaultCloseOperation(3);
29.              f.setVisible(true);
30.         }
31.    }

Compilez puis exécutez ce programme, il sera affiché ce qui est prévu dans l'énoncé. Et d'après l'énoncé, on reconnait tout de suite que la disposition des composants graphiques se fait grâce au gestionnaire par défaut : BorderLayout

Inutile de le préciser. Pas besoin de faire : conteneur.setLayout( new BorderLayout() );
On ajoute chaque composant en précisant simplement la position dans la fenêtre.

bouton au Nord, en haut. - zoneTexte au centre. Pour le centre, remarquez, la précision est inutile. - bouton2 au sud, en bas.
radio (bouton radio) à l'Est, à gauche - Et enfin case à cocher cocher à l'Ouest, à droite.
EXERCICE 6

Ecrire un programme qui permet d'afficher une petite fenêtre dans laquelle on trouve 2 séries de boutons radio. Chaque série contient au moins 2 boutons radio. Autrement dit, on peut sélectionner 2 boutons radio appartenant chacun à sa série. Mais on ne peut pas sélectionner 2 boutons appartenant à la même série.

Embellir en donnant un nom à chaque série et un nom à chaque bouton radio.

Choisissez le gestionnaire de mise en forme qui vous convient.
 CORRECTION EXERCICE 6 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreGestionnaireForme
5.     {
6.          public static void main (String [] args)
7.          {
8.              JFrame f = new JFrame();
9.              Container conteneur = f.getContentPane();
10.             f.setSize(400, 300);
11.             
12.             JPanel p1 = new JPanel();
13.             JPanel p2 = new JPanel();
14.             
15.             conteneur.add(p1, "North");
16.             conteneur.add(p2, "South");
17.             
18.             JRadioButton r1 = new JRadioButton("Anglais");
19.             JRadioButton r2 = new JRadioButton("Espagnol");
20.             JRadioButton r3 = new JRadioButton("Allemand");
21.             JLabel etiket1 = new JLabel("Choix de votre 2ème langue");
22.             
23.             ButtonGroup gr = new ButtonGroup(); 
24.             gr.add(r1); p1.add(r1); 
25.             gr.add(r2); p1.add(r2);
26.             gr.add(r3); p1.add(r3); p1.add(etiket1);
27.             
28.             JRadioButton r4 = new JRadioButton("homme");
29.             JRadioButton r5 = new JRadioButton("femme");
30.             JRadioButton r6 = new JRadioButton("trans");
31.             JLabel etiket2 = new JLabel("Choix de votre sexe");
32.             
33.             ButtonGroup gr2 = new ButtonGroup(); 
34.             gr2.add(r4); p2.add(r4);
35.             gr2.add(r5); p2.add(r5);
36.             gr2.add(r6); p2.add(r6); p2.add(etiket2);
37.              
38.             f.setDefaultCloseOperation(3);
39.             f.setVisible(true);
40.         }
41.    }
Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre avec 3 boutons radio au Nord de la fenêtre et 3 autres boutons au sur de la fenêtre.

Cliquez sur un des boutons du nord. Il sera sélectionné. Cliquez sur un autre bouton situé au nord. Il sera sélectionné mais le précédent sera désélectionné.

Cliquez sur un des boutons du sud. Il sera sélectionné. Cliquez sur un autre bouton situé au sud. Il sera sélectionné mais le précédent sera désélectionné.

Mais on peut voir 2 boutons radio différents sélectionnés. Chacun de ces boutons appartient à 2 groupes différents (Groupe Nord et Groupe Sud).

Explications :

On crée 2 panneaux p1 et p2 (lignes 12 et 13). On les ajoute dans le conteneur créé en ligne 9.

On crée 3 boutons radio r1, r2 et r3 (lignes 18 à 20). Puis en ligne 21, on crée une étiquette dont le texte est "Choix de votre 2ème langue".
Ligne 23 : on crée un objet de type ButtonGroup. Tous les boutons ajoutés à ce groupe auront la caractériqtique suivante : la sélection d'un bouton du groupe entraine forcément la désactivation du bouton de ce même groupe précédement sélectionné.

Ligne 24 : on ajoute le bouton r1 au groupe. Puis on ajoute ce même bouton au panneau p1.
Ligne 25 : même explication pour le bouton r2.
Ligne 26 : même explication pour le bouton r3. En plus, on ajoute l'étiquette etiket1 au panneau.

De la ligne 28 à la ligne 36 : Même raisonnement pour les boutons r5, r6, r7 et l'étiquette etiket2. Le tout sur le panneau p2.

On peut sélectionner 2 boutons appartenant à 2 groupe de boutons différents.
EXERCICE 7

Ecrire un programme qui permet d'afficher une petite fenêtre dans laquelle on voit 3 boutons dont la taille diffère d'un bouton à l'autre.
 CORRECTION EXERCICE 7 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     
4.     public class FenetreGestionnaireForme
5.     {
6.          public static void main (String [] args)
7.          {
8.              JFrame f = new JFrame();
9.              Container conteneur = f.getContentPane();
10.             conteneur.setLayout(new FlowLayout() ); 
11.             f.setSize(400, 300);
12.             
13.             JButton bouton1 = new JButton("1");
14.             bouton1.setPreferredSize(new Dimension(50, 50) );
15.             conteneur.add(bouton1);
16.             
17.             JButton bouton2 = new JButton("2");
18.             bouton2.setPreferredSize(new Dimension(75, 50) );
19.             conteneur.add(bouton2);
20.             
21.             JButton bouton3 = new JButton("3");
22.             bouton3.setPreferredSize(new Dimension(100, 50) );
23.             conteneur.add(bouton3);
24.             
25.             f.setDefaultCloseOperation(3);
26.             f.setVisible(true);
27.        }
28.    }
Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre avec 3 boutons appelés 1, 2 et 3 dont la taille varie d'un bouton à l'autre. Ils ont la la même hauteur (50 pixels) mais une largeur différente : 50 pixels, 75 pixels et 100 pixels.

Explications :

Ligne 13 : On crée un bouton bouton1 et dont le nom sur le bouton est 1. On lui donne une taille grâce à la méthode setPreferredSize() qui requiert un argument de type Dimension lequel est créé grâce à un constructeur qui requiert 2 arguments de type int. Le premier étant la largeur et le deuxième étant la hauteur. Donc, 50 pixels de largeur et 50 pixels de hauteur.

Même raisonnement pour les 2 autres boutons. Ce qui change, c'est la largeur. 75 pour le bouton "2" et 100 pixels pour le bouton "3".

Sachez que la méthode setPreferredSize() n'est pas tenue en compte par le gestionnaire par défaut des fenêtres : BorderLayout.

Sachez qu'on peut modifier la taille d'un composant graphique au cours du déroulement du programme. Dans ce cas, les choses ne sont pas aussi simples que ci-dessus. On verra comment ça se passe dans le chapitre suivant : mise en oeuvre des évènements.

La connaissance, c'est bien. La partager, c'est mieux
Conseiller ce site à un(e) ami(e):

Son e-mail est :       
Une suggestion à faire pour ce site ? ... Contact : webmaster@debutantprog.com
← (précédent) D.10 Les gestionnaires de mise en forme
D.12 Exercices corrigés 2
Accueil S O M M A I R E

D.11 Exercices corrigés