Exercices en Java (11-Graphisme et Java2D)

Sébastien ESTIENNE

Ce onzième chapitre porte sur le graphisme et Java2D.
Le premier exercice propose de dessiner un histogramme. Le deuxième exercice montre l'utilisation du JColorChooser. Le troisième exercice illustre les différentes formes de base que l'on peut dessiner et le quatrième exercice concerne les styles de formes. Le sixième exercice a pour but de dessiner des formes ovales de différentes tailles et de différentes couleurs à intervalle de temps régulier. Et, le septième exercice est une implémentation d'un labyrinthe en version graphique.

Les principales notions abordées sont les suivantes :

- contexte graphique et objets graphiques ;

- les couleurs ;

- les polices de caractères ;

- tracé de formes.

Pour faire et comprendre ces exercices, vous aurez besoin d'un certain nombre de notions sur le langage Java en rapport avec le chapitre. Pour cela, vous pouvez consulter les tutoriels Java de developpez.com à l'adresse suivante : https://java.developpez.com/cours/

La documentation de l'API sur le site de Sun est aussi une mine d'or : http://docs.oracle.com/javase/6/docs/api/

Commentez ♪

- Titre : Exercices en Java (11-Graphisme et Java2D)

- Auteur : Sébastien ESTIENNE

- Parution : 17 mars 2012

- Mise à jour : 17 avril 2012

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2012 Sébastien ESTIENNE. Aucune reproduction, même 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 intérêts.

Sommaire

- I. Histogramme

- I-1. Énoncé

- I-2. Aperçu

- I-3. Démonstration

- I-4. Solution

- II. Choix de couleurs

- II-1. Énoncé

- II-2. Aperçu

- II-3. Démonstration

- II-4. Solution

- III. Polices de caractères

- III-1. Énoncé

- III-2. Aperçu

- III-3. Démonstration

- III-4. Solution

- IV. Formes graphiques

- IV-1. Énoncé

- IV-2. Aperçu

- IV-3. Démonstration

- IV-4. Solution

- V. Style des formes

- V-1. Énoncé

- V-2. Aperçu

- V-3. Démonstration

- V-4. Solution

- VI. Disques aléatoires

- VI-1. Énoncé

- VI-2. Aperçu

- VI-3. Démonstration

- VI-4. Solution

- VII. Labyrinthe graphique

- VII-1. Énoncé

- VII-2. Aperçu

- VII-3. Démonstration

- VII-4. Solution

- VIII. Remerciements

I - Histogramme

I-1 - Énoncé

Écrivez un programme qui représente un histogramme. Celui-ci doit contenir six valeurs donc six barres (représentées par des rectangles) de couleurs différentes. Affichez aussi les axes (lignes) et la valeur au-dessus de chaque barre de l'histogramme.

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.Graphics ;

- javax.swing.JFrame.

I-2 - Aperçu

Aperçu du résultat.

I-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

I-4 - Solution

Histogramme.java

1. /*

2. * Fichier : Histogramme.java

3. * Créé le : 7 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.Graphics;

30. import javax.swing.JFrame;

34. /**

35. * <p>Classe représentant un histogramme.</p>

36. * @author Sébastien ESTIENNE.

37. */

38. public class Histogramme extends JFrame

39. {

40. /**

41. * <p>Serial version UID.</p>

42. */

43. private static final long serialVersionUID = 1L;

45. /** Valeurs de l'histogramme. */

46. private int[] valeurs;

48. /** Valeur maximum. */

49. private int max;

51. /** Couleurs de barres de l'histogramme. */

52. private Color[] couleurs;

54. /** Décalage en X du graphique par rapport à la gauche de la fenêtre. */

55. private static final int DEC_X = 40;

57. /** Décalage en Y du graphique par rapport au bas de la fenêtre. */

58. private static final int DEC_Y = 40;

60. /** Décalage en X du texte au-dessus des barres de l'histogramme. */

61. private static final int DEC_TX = DEC_X + 5;

63. /** Décalage en Y du texte au-dessus des barres de l'histogramme. */

64. private static final int DEC_TY = DEC_Y + 2;

66. /** Décalage en hauteur de la ligne permettant de créer la flèche. */

67. private static final int DEC_FH = 4;

69. /** Décalage en longueur de la ligne permettant de créer la flèche. */

70. private static final int DEC_FL = 8;

72. /** Largeur d'une barre de l'histogramme. */

73. private static final int LG_B = 30;

75. /** Incrément pour calculer la hauteur des barres de l'histogramme en fonction de la valeur. */

76. private static final int INCR = 10;

78. /**

79. * <p>Constructeur pour l'histogramme.</p>

80. */

81. public Histogramme()

82. {

83. super("Histogramme");

85. // Initialisation des valeurs.

86. this.valeurs = new int[6];

87. this.valeurs[0] = 12;

88. this.valeurs[1] = 10;

89. this.valeurs[2] = 17;

90. this.valeurs[3] = 5;

91. this.valeurs[4] = 13;

92. this.valeurs[5] = 8;

93. this.max = 20;

95. // Initialisation des couleurs.

96. this.couleurs = new Color[6];

97. this.couleurs[0] = Color.RED;

98. this.couleurs[1] = Color.GREEN;

99. this.couleurs[2] = Color.BLUE;

100. this.couleurs[3] = Color.YELLOW;

101. this.couleurs[4] = Color.MAGENTA;

102. this.couleurs[5] = new Color(255, 102, 0);

104. // Propriétés de la fenêtre.

105. setLocation(50, 50);

106. setSize(350, 300);

107. setVisible(true);

108. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

109. }

112. /**

113. * <p>Dessine la fenêtre.</p>

114. * @param g Le contexte graphique utilisé pour dessiner.

115. */

116. @Override

117. public void paint(Graphics g)

118. {

119. // Déclaration des variables utiles pour les calculs de l'histogramme.

120. int x, y, x1, y1, x2, y2, largeur, hauteur;

122. // Affichage des barres.

123. for(int i = 0; i < this.valeurs.length; i++)

124. {

125. // Barre.

126. x = DEC_X + i * (LG_B + 1);

127. y = getHeight() - DEC_Y - this.valeurs[i] * INCR;

128. largeur = LG_B;

129. hauteur = this.valeurs[i] * INCR;

130. g.setColor(this.couleurs[i]);

131. g.fillRect(x, y, largeur, hauteur);

133. // Valeur.

134. x = DEC_TX + i * (LG_B + 1);

135. y = getHeight() - DEC_TY - this.valeurs[i] * INCR;

136. g.setColor(Color.BLACK);

137. g.drawString("" + this.valeurs[i], x, y);

138. }

140. // Affichage de l'axe X.

141. g.setColor(Color.BLACK);

142. x1 = DEC_X;

143. y1 = getHeight() - DEC_Y;

144. x2 = x1 + this.valeurs.length * LG_B + LG_B;

145. y2 = y1;

146. g.drawLine(x1, y1, x2, y2);

147. g.drawLine(x2, y2, x2 - DEC_FL, y2 - DEC_FH);

148. g.drawLine(x2, y2, x2 - DEC_FL, y2 + DEC_FH);

150. // Affichage de l'axe Y.

151. x1 = DEC_X;

152. y1 = getHeight() - DEC_Y;

153. x2 = x1;

154. y2 = y1 - this.max * INCR;

155. g.drawLine(x1, y1, x2, y2);

156. g.drawLine(x2, y2, x2 - DEC_FH, y2 + DEC_FL);

157. g.drawLine(x2, y2, x2 + DEC_FH, y2 + DEC_FL);

158. }

161. /**

162. * <p>Commence l'exécution du programme.</p>

163. * @param args Les paramètres de la ligne de commande.

164. */

165. public static void main(String[] args)

166. {

167. new Histogramme();

168. }

169. }

II - Choix de couleurs

II-1 - Énoncé

Écrivez un programme avec un bouton qui ouvre une fenêtre de sélection de couleur : JColorChooser et qui permet ainsi de changer la couleur de fond de la fenêtre.

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.FlowLayout ;

- java.awt.event.ActionEvent ;

- java.awt.event.ActionListener ;

- javax.swing.JButton ;

- javax.swing.JColorChooser ;

- javax.swing.JFrame.

II-2 - Aperçu

Aperçu du résultat.

II-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

II-4 - Solution

ColorChooser.java

1. /*

2. * Fichier : ColorChooser.java

3. * Créé le : 8 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.FlowLayout;

29. import java.awt.event.ActionEvent;

30. import java.awt.event.ActionListener;

32. import javax.swing.JButton;

33. import javax.swing.JColorChooser;

34. import javax.swing.JFrame;

38. /**

39. * <p>Classe utilisant un JColorChooser.</p>

40. * @author Sébastien ESTIENNE.

41. */

42. public class ColorChooser extends JFrame

43. {

44. /**

45. * <p>Serial version UID.</p>

46. */

47. private static final long serialVersionUID = 1L;

49. /** Bouton pour changer la couleur de fond. */

50. private JButton boutonCouleur;

53. /**

54. * <p>Constructeur initialisant la fenêtre.</p>

55. */

56. public ColorChooser()

57. {

58. super("ColorChooser");

60. // Change le gestionnaire de canvas.

61. getContentPane().setLayout(new FlowLayout());

63. // Crée le bouton.

64. this.boutonCouleur = new JButton("Changer couleur");

65. this.boutonCouleur.addActionListener(

66. /** L'interface écouteur permettant de recevoir des événements d'actions. */

67. new ActionListener()

68. {

69. // Invoqué quand une action se produit.

70. public void actionPerformed(ActionEvent e)

71. {

72. // Demander à l'utilisateur de choisir une couleur grâce au JColorChooser.

73. Color c = JColorChooser.showDialog(ColorChooser.this, "Choisissez une couleur de fond",

74. ColorChooser.this.getContentPane().getBackground());

75. // Change la couleur de fond.

76. if(c != null)

77. {

78. ColorChooser.this.getContentPane().setBackground(c);

79. }

80. }

81. });

83. // Ajoute le bouton.

84. getContentPane().add(this.boutonCouleur);

86. // Propriétés de la fenêtre.

87. setLocation(50, 50);

88. setSize(400, 200);

89. setVisible(true);

90. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

91. }

94. /**

95. * <p>Commence l'exécution du programme.</p>

96. * @param args Les paramètres de la ligne de commande.

97. */

98. public static void main(String[] args)

99. {

100. new ColorChooser();

101. }

102. }

III - Polices de caractères

III-1 - Énoncé

Écrivez un programme avec une fenêtre contenant trois chaînes de caractères de styles, polices et couleurs différents :

- Monospaced 10 pt normal bleu ;

- Serif 12 pt gras rouge ;

- Sans Serif 14 pt italique vert.

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.Font ;

- java.awt.Graphics ;

- javax.swing.JFrame.

III-2 - Aperçu

Aperçu du résultat.

III-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

III-4 - Solution

PolicesCaracteres.java

1. /*

2. * Fichier : PolicesCaracteres.java

3. * Créé le : 8 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.Font;

29. import java.awt.Graphics;

31. import javax.swing.JFrame;

35. /**

36. * <p>Classe utilisant les polices de caractères.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class PolicesCaracteres extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Constructeur initialisant la fenêtre.</p>

49. */

50. public PolicesCaracteres()

51. {

52. super("Polices de caractères");

54. // Propriétés de la fenêtre.

55. setLocation(50, 50);

56. setSize(300, 150);

57. setVisible(true);

58. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

59. }

62. /**

63. * <p>Dessine la fenêtre.</p>

64. * @param g Le contexte graphique utilisé pour dessiner.

65. */

66. @Override

67. public void paint(Graphics g)

68. {

69. // Monospaced 10 pt normal bleu.

70. g.setColor(Color.BLUE);

71. g.setFont(new Font("Monospaced", Font.PLAIN, 10));

72. g.drawString("Monospaced 10 pt normal bleu.", 40, 60);

74. // Serif 12 pt gras rouge.

75. g.setColor(Color.RED);

76. g.setFont(new Font("Serif", Font.BOLD, 12));

77. g.drawString("Serif 12 pt gras rouge.", 40, 90);

79. // Sans Serif 14 pt italique vert.

80. g.setColor(Color.GREEN);

81. g.setFont(new Font("Sans Serif", Font.ITALIC, 14));

82. g.drawString("Sans Serif 14 pt italique vert.", 40, 120);

83. }

86. /**

87. * <p>Commence l'exécution du programme.</p>

88. * @param args Les paramètres de la ligne de commande.

89. */

90. public static void main(String[] args)

91. {

92. new PolicesCaracteres();

93. }

94. }

IV - Formes graphiques

IV-1 - Énoncé

Écrivez un programme avec une fenêtre contenant les formes graphiques suivantes :

- un rectangle bleu ;

- un rectangle plein bleu ;

- un rectangle arrondi magenta ;

- un rectangle arrondi plein magenta ;

- un ovale vert ;

- un ovale plein vert ;

- un arc orange ;

- un arc plein orange ;

- une ligne rouge ;

- une polyligne noire ;

- un polygone noir.

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.Graphics ;

- java.awt.Polygon ;

- javax.swing.JFrame.

IV-2 - Aperçu

Aperçu du résultat.

IV-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

IV-4 - Solution

FormesGraphiques.java

1. /*

2. * Fichier : FormesGraphiques.java

3. * Créé le : 8 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.Graphics;

29. import java.awt.Polygon;

31. import javax.swing.JFrame;

35. /**

36. * <p>Classe utilisant différentes formes graphiques de base.</p>

37. * @author Sébastien ESTIENNE.

38. */

39. public class FormesGraphiques extends JFrame

40. {

41. /**

42. * <p>Serial version UID.</p>

43. */

44. private static final long serialVersionUID = 1L;

47. /**

48. * <p>Constructeur initialisant la fenêtre.</p>

49. */

50. public FormesGraphiques()

51. {

52. super("Formes graphiques");

54. // Propriétés de la fenêtre.

55. setLocation(50, 50);

56. setSize(350, 250);

57. setVisible(true);

58. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

59. }

62. /**

63. * <p>Dessine la fenêtre.</p>

64. * @param g Le contexte graphique utilisé pour dessiner.

65. */

66. @Override

67. public void paint(Graphics g)

68. {

69. // Un rectangle bleu.

70. g.setColor(Color.BLUE);

71. g.drawRect(20, 40, 60, 40);

73. // Un rectangle plein bleu.

74. g.fillRect(90, 40, 60, 40);

76. // Un rectangle arrondi magenta.

77. g.setColor(Color.MAGENTA);

78. g.drawRoundRect(180, 40, 60, 40, 12, 12);

80. // Un rectangle arrondi plein magenta.

81. g.fillRoundRect(250, 40, 60, 40, 12, 12);

83. // Un ovale vert.

84. g.setColor(Color.GREEN);

85. g.drawOval(20, 100, 60, 40);

87. // Un ovale plein vert.

88. g.fillOval(90, 100, 60, 40);

90. // Un arc orange.

91. g.setColor(Color.ORANGE);

92. g.drawArc(180, 100, 40, 40, 90, 270);

94. // Un arc plein orange.

95. g.fillArc(250, 100, 40, 40, 0, 270);

97. // Une ligne rouge.

98. g.setColor(Color.RED);

99. g.drawLine(20, 160, 80, 200);

101. // Une polyligne noire.

102. g.setColor(Color.BLACK);

103. int nbPoints = 3;

104. int[] xPoints = {180, 210, 240};

105. int[] yPoints = {200, 160, 200};

106. g.drawPolygon(xPoints, yPoints, nbPoints);

108. // Un polygone noire.

109. Polygon p = new Polygon();

110. p.addPoint(250, 160);

111. p.addPoint(310, 160);

112. p.addPoint(310, 200);

113. p.addPoint(280, 200);

114. p.addPoint(280, 180);

115. p.addPoint(250, 180);

116. g.fillPolygon(p);

117. }

120. /**

121. * <p>Commence l'exécution du programme.</p>

122. * @param args Les paramètres de la ligne de commande.

123. */

124. public static void main(String[] args)

125. {

126. new FormesGraphiques();

127. }

128. }

V - Style des formes

V-1 - Énoncé

Écrivez un programme avec une fenêtre contenant les formes graphiques suivantes :

- un rectangle vert avec traits épais ;

- un rectangle arrondi avec un dégradé bleu-rouge comme couleur de remplissage ;

- un ovale avec un motif à l'intérieur ;

- un trait fort orange en pointillé.

Classes de l'API utilisées :

- java.awt.BasicStroke ;

- java.awt.Color ;

- java.awt.GradientPaint ;

- java.awt.Graphics ;

- java.awt.Graphics2D ;

- java.awt.Rectangle ;

- java.awt.TexturePaint ;

- java.awt.geom.Ellipse2D ;

- java.awt.geom.Line2D ;

- java.awt.geom.Rectangle2D ;

- java.awt.geom.RoundRectangle2D ;

- java.awt.image.BufferedImage ;

- javax.swing.JFrame.

V-2 - Aperçu

Aperçu du résultat.

V-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

V-4 - Solution

StylesFormes.java

1. /*

2. * Fichier : StylesFormes.java

3. * Créé le : 8 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.BasicStroke;

28. import java.awt.Color;

29. import java.awt.GradientPaint;

30. import java.awt.Graphics;

31. import java.awt.Graphics2D;

32. import java.awt.Rectangle;

33. import java.awt.TexturePaint;

34. import java.awt.geom.Ellipse2D;

35. import java.awt.geom.Line2D;

36. import java.awt.geom.Rectangle2D;

37. import java.awt.geom.RoundRectangle2D;

38. import java.awt.image.BufferedImage;

40. import javax.swing.JFrame;

44. /**

45. * <p>Classe utilisant différents styles des formes.</p>

46. * @author Sébastien ESTIENNE.

47. */

48. public class StylesFormes extends JFrame

49. {

50. /**

51. * <p>Serial version UID.</p>

52. */

53. private static final long serialVersionUID = 1L;

56. /**

57. * <p>Constructeur initialisant la fenêtre.</p>

58. */

59. public StylesFormes()

60. {

61. super("Styles des formes");

63. // Propriétés de la fenêtre.

64. setLocation(50, 50);

65. setSize(350, 250);

66. setVisible(true);

67. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

68. }

71. /**

72. * <p>Dessine la fenêtre.</p>

73. * @param g Le contexte graphique utilisé pour dessiner.

74. */

75. @Override

76. public void paint(Graphics g)

77. {

78. // Passage à la 2D.

79. Graphics2D g2d = (Graphics2D) g;

81. // Un rectangle vert avec une épaisseur de trait.

82. g2d.setPaint(Color.GREEN);

83. g2d.setStroke(new BasicStroke(5.0f));

84. g2d.draw(new Rectangle2D.Double(20, 40, 80, 50));

86. // Un rectangle arrondi avec un dégradé bleu-rouge.

87. g2d.setPaint(new GradientPaint(0, 0, Color.BLUE, 0, 40, Color.RED, true));

88. g2d.fill(new RoundRectangle2D.Double(140, 40, 80, 50, 15, 15));

90. // Un ovale avec un motif à l'intérieur.

91. BufferedImage motif = new BufferedImage(9, 9, BufferedImage.TYPE_INT_RGB);

92. Graphics2D gm = motif.createGraphics();

93. gm.setColor(Color.RED);

94. gm.fillRect(0, 0, 9, 9);

95. gm.setColor(Color.GREEN);

96. gm.fillRect(2, 2, 7, 7);

97. gm.setColor(Color.BLUE);

98. gm.fillRect(4, 4, 3, 3);

99. g2d.setPaint(new TexturePaint(motif, new Rectangle(9, 9)));

100. g2d.fill(new Ellipse2D.Double(20, 110, 80, 50));

102. // Un trait fort orange en pointillé.

103. g2d.setPaint(Color.ORANGE);

104. float[] tirets = {10, 5, 2, 5};

105. g2d.setStroke(new BasicStroke(2, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL, 10, tirets,

106. 0));

107. g2d.draw(new Line2D.Double(140, 110, 220, 160));

108. }

111. /**

112. * <p>Commence l'exécution du programme.</p>

113. * @param args Les paramètres de la ligne de commande.

114. */

115. public static void main(String[] args)

116. {

117. new StylesFormes();

118. }

119. }

VI - Disques aléatoires

VI-1 - Énoncé

Écrivez un programme qui affiche de manière aléatoire des disques de tailles et de couleurs différentes dans une fenêtre. Utilisez un Timer (javax.swing) permettant d'afficher les disques à intervalle de temps régulier.

Timer minuterie = new Timer(int delai, ActionListener tache);
minuterie.start();

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.Graphics ;

- java.awt.event.ActionEvent ;

- java.awt.event.ActionListener ;

- javax.swing.JFrame ;

- javax.swing.Timer.

VI-2 - Aperçu

Aperçu du résultat.

VI-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VI-4 - Solution

DisquesAleatoires.java

1. /*

2. * Fichier : DisquesAleatoires.java

3. * Créé le : 9 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.Graphics;

29. import java.awt.event.ActionEvent;

30. import java.awt.event.ActionListener;

32. import javax.swing.JFrame;

33. import javax.swing.Timer;

37. /**

38. * <p>Classe affichant des disques de manière aléatoire.</p>

39. * @author Sébastien ESTIENNE.

40. */

41. public class DisquesAleatoires extends JFrame implements ActionListener

42. {

43. /**

44. * <p>Serial version UID.</p>

45. */

46. private static final long serialVersionUID = 1L;

48. /** La minuterie pour l'affichage des disques. */

49. private Timer minuterie;

52. /**

53. * <p>Constructeur initialisant la fenêtre.</p>

54. */

55. public DisquesAleatoires()

56. {

57. super("Disques aléatoires");

59. // Initialisation du timer.

60. this.minuterie = new Timer(50, this);

61. this.minuterie.start();

63. // Propriétés de la fenêtre.

64. setLocation(50, 50);

65. setSize(400, 300);

66. setVisible(true);

67. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

68. }

71. /**

72. * <p>Dessine la fenêtre.</p>

73. * @param g Le contexte graphique utilisé pour dessiner.

74. */

75. @Override

76. public void paint(Graphics g)

77. {

78. // Trois nombres aléatoires entre 0 et 255 pour la couleur.

79. int r = (int) (Math.random() * 256);

80. int v = (int) (Math.random() * 256);

81. int b = (int) (Math.random() * 256);

83. // Coordonnées et taille de l'ovale.

84. int x = (int) (Math.random() * getWidth());

85. int y = (int) (Math.random() * getHeight());

86. int taille = 10 + (int) (Math.random() * 65);

88. // Dessine le disque.

89. g.setColor(new Color(r, v, b));

90. g.fillOval(x, y, taille, taille);

91. }

94. /**

95. * Invoqué quand une action se produit.

96. * @param e L'événement qui indique qu'une action s'est produite.

97. */

98. public void actionPerformed(ActionEvent e)

99. {

100. repaint();

101. }

104. /**

105. * <p>Commence l'exécution du programme.</p>

106. * @param args Les paramètres de la ligne de commande.

107. */

108. public static void main(String[] args)

109. {

110. new DisquesAleatoires();

111. }

112. }

VII - Labyrinthe graphique

VII-1 - Énoncé

Écrivez une version graphique du parcours de labyrinthe (chapitre 6).
L'algorithme le plus simple qui permet de trouver la sortie d'un labyrinthe (si elle existe), est de garder toujours sa main droite le long du mur en suivant les changements de direction avec cette même main. Évidemment ce n'est certainement pas le plus court… mais on trouve la sortie ainsi.
Écrivez une méthode récursive qui implémente cet algorithme. Utilisez aussi un JTextArea pour afficher une représentation du labyrinthe et ajoutez un bouton permettant de suivre étape par étape le parcours dans le labyrinthe.

# # # # # # # # # # # #
# . . . # . . . . . . #
. . # . # . # # # # . #
# # # . # . . . . # . #
# . . . . # # # . # . .
# # # # . # . # . # . #
# . . # . # . # . # . #
# # . # . # . # . # . #
# . . . . . . . . # . #
# # # # # # . # # # . #
# . . . . . . # . . . #
# # # # # # # # # # # #

Classes de l'API utilisées :

- java.awt.Color ;

- java.awt.Graphics ;

- java.awt.event.ActionEvent ;

- java.awt.event.ActionListener ;

- javax.swing.JFrame ;

- javax.swing.Timer.

VII-2 - Aperçu

Aperçu du résultat.

VII-3 - Démonstration

Lancer avec Java Web Start

Note : javaws -viewer (accessible également depuis le panneau de configuration Java) permet de voir les différentes applications JWS en cache et de les gérer.

VII-4 - Solution

LabyrintheGraphique.java

1. /*

2. * Fichier : LabyrintheGraphique.java

3. * Créé le : 10 février 2007.

4. * Modifié : 15 avril 2012.

5. * Auteurs : Sébastien ESTIENNE.

6. * SiteWeb : http://www.prog-info.org/

7. *

8. * This program is free software; you can redistribute it and/or modify

9. * it under the terms of the GNU General Public License as published by

10. * the Free Software Foundation; either version 2 of the License, or

11. * (at your option) any later version.

12. *

13. * This program is distributed in the hope that it will be useful,

14. * but WITHOUT ANY WARRANTY; without even the implied warranty of

15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

16. * GNU General Public License for more details.

17. *

18. * You should have received a copy of the GNU General Public License

19. * along with this program; if not, write to the Free Software

20. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

21. */

23. package chapitre11;

27. import java.awt.Color;

28. import java.awt.Graphics;

29. import java.awt.event.ActionEvent;

30. import java.awt.event.ActionListener;

32. import javax.swing.JFrame;

33. import javax.swing.Timer;

37. /**

38. * <p>Classe affichant le parcours de labyrinthes.</p>

39. * @author Sébastien ESTIENNE.

40. */

41. public class LabyrintheGraphique extends JFrame implements ActionListener

42. {

43. /**

44. * <p>Serial version UID.</p>

45. */

46. private static final long serialVersionUID = 1L;

48. /** La minuterie pour l'affichage des disques. */

49. private Timer minuterie;

51. /** Le labyrinthe. */

52. private boolean[][] labyrinthe = {

53. {false, false, false, false, false, false, false, false, false, false, false, false},

54. {false, true, true, true, false, true, true, true, true, true, true, false},

55. {true, true, false, true, false, true, false, false, false, false, true, false},

56. {false, false, false, true, false, true, true, true, true, false, true, false},

57. {false, true, true, true, true, false, false, false, true, false, true, true},

58. {false, false, false, false, true, false, true, false, true, false, true, false},

59. {false, true, true, false, true, false, true, false, true, false, true, false},

60. {false, false, true, false, true, false, true, false, true, false, true, false},

61. {false, true, true, true, true, true, true, true, true, false, true, false},

62. {false, false, false, false, false, false, true, false, false, false, true, false},

63. {false, true, true, true, true, true, true, false, true, true, true, false},

64. {false, false, false, false, false, false, false, false, false, false, false, false}};

66. /** Position courante en x dans le labyrinthe. */

67. private int x;

69. /** Position courante en y dans le labyrinthe. */

70. private int y;

72. /** Position de départ en x dans le labyrinthe. */

73. private final int xd = 0;

75. /** Position de départ en y dans le labyrinthe. */

76. private final int yd = 2;

78. /** Énumération pour la direction. */

79. private enum Direction

80. {

81. /** Direction : vers la droite. */

82. DROITE,

83. /** Direction : vers le bas. */

84. BAS,

85. /** Direction : vers la gauche. */

86. GAUCHE,

87. /** Direction : vers le haut. */

88. HAUT

89. }

91. /** La direction courante. */

92. private Direction direction;

94. /** Taille du pion se déplaçant dans le labyrinthe. */

95. private static final int TAILLE_PION = 18;

97. /** Taille des cases du labyrinthe. */

98. private static final int TAILLE_CASE = 20;

100. /** Taille du décalage à gauche du labyrinthe. */

101. private static final int DEC_GAUCHE = 25;

103. /** Taille du décalage en haut du labyrinthe. */

104. private static final int DEC_HAUT = 50;

107. /**

108. * <p>Constructeur initialisant la fenêtre.</p>

109. */

110. public LabyrintheGraphique()

111. {

112. super("Labyrinthe graphique");

114. // Initialisation du labyrinthe.

115. this.x = 0;

116. this.y = 2;

117. this.direction = Direction.DROITE;

119. // Initialisation du timer.

120. this.minuterie = new Timer(500, this);

121. this.minuterie.start();

123. // Propriétés de la fenêtre.

124. setLocation(50, 50);

125. setSize(295, 315);

126. setVisible(true);

127. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

128. }

131. /**

132. * <p>Algorithme permettant d'avancer dans le labyrinthe.</p>

133. */

134. public void avancer()

135. {

136. // Vérification de terminaison.

137. if(this.x == this.xd && this.y == this.yd || this.x > 0 && this.y > 0

138. && this.x < this.labyrinthe[0].length && this.y < this.labyrinthe.length)

139. {

140. switch(this.direction)

141. {

142. // Direction de déplacement : Droite.

143. case DROITE:

144. // Pas de mur sur la droite : dans un angle.

145. if(this.y + 1 < this.labyrinthe.length && this.labyrinthe[this.y + 1][this.x])

146. {

147. this.direction = Direction.BAS;

148. this.y++;

149. }

150. // Un mur selon la direction de déplacement.

151. else if(this.x + 1 < this.labyrinthe[0].length && !this.labyrinthe[this.y][this.x + 1])

152. {

153. // Changement de direction suivant le mur.

154. if(this.y - 1 >= 0 && this.labyrinthe[this.y - 1][this.x])

155. {

156. this.direction = Direction.HAUT;

157. this.y--;

158. }

159. // Impasse : demi-tour.

160. else

161. {

162. this.direction = Direction.GAUCHE;

163. this.x--;

164. }

165. }

166. // Case libre devant : déplacement selon la direction.

167. else if(this.x + 1 < this.labyrinthe[0].length)

168. {

169. this.x++;

170. }

171. else

172. {

173. this.minuterie.stop();

174. }

175. break;

176. // Direction de déplacement : Bas.

177. case BAS:

178. // Pas de mur sur la droite : dans un angle.

179. if(this.x - 1 >= 0 && this.labyrinthe[this.y][this.x - 1])

180. {

181. this.direction = Direction.GAUCHE;

182. this.x--;

183. }

184. // Un mur selon la direction de déplacement.

185. else if(this.y + 1 < this.labyrinthe.length && !this.labyrinthe[this.y + 1][this.x])

186. {

187. // Changement de direction suivant le mur.

188. if(this.x + 1 < this.labyrinthe[0].length && this.labyrinthe[this.y][this.x + 1])

189. {

190. this.direction = Direction.DROITE;

191. this.x++;

192. }

193. // Impasse : demi-tour.

194. else

195. {

196. this.direction = Direction.HAUT;

197. this.y--;

198. }

199. }

200. // Case libre devant : déplacement selon la direction.

201. else if(this.y + 1 < this.labyrinthe.length)

202. {

203. this.y++;

204. }

205. else

206. {

207. this.minuterie.stop();

208. }

209. break;

210. // Direction de déplacement : Gauche.

211. case GAUCHE:

212. // Pas de mur sur la droite : dans un angle.

213. if(this.y - 1 >= 0 && this.labyrinthe[this.y - 1][this.x])

214. {

215. this.direction = Direction.HAUT;

216. this.y--;

217. }

218. // Un mur selon la direction de déplacement.

219. else if(this.x - 1 >= 0 && !this.labyrinthe[this.y][this.x - 1])

220. {

221. // Changement de direction suivant le mur.

222. if(this.y + 1 < this.labyrinthe[0].length && this.labyrinthe[this.y + 1][this.x])

223. {

224. this.direction = Direction.BAS;

225. this.y++;

226. }

227. // Impasse : demi-tour.

228. else

229. {

230. this.direction = Direction.DROITE;

231. this.x++;

232. }

233. }

234. // Case libre devant : déplacement selon la direction.

235. else if(this.x - 1 >= 0)

236. {

237. this.x--;

238. }

239. else

240. {

241. this.minuterie.stop();

242. }

243. break;

244. // Direction de déplacement : Haut.

245. case HAUT:

246. // Pas de mur sur la droite : dans un angle.

247. if(this.x + 1 < this.labyrinthe.length && this.labyrinthe[this.y][this.x + 1])

248. {

249. this.direction = Direction.DROITE;

250. this.x++;

251. }

252. // Un mur selon la direction de déplacement.

253. else if(this.y - 1 >= 0 && !this.labyrinthe[this.y - 1][this.x])

254. {

255. // Changement de direction suivant le mur.

256. if(this.x - 1 >= 0 && this.labyrinthe[this.y][this.x - 1])

257. {

258. this.direction = Direction.GAUCHE;

259. this.x--;

260. }

261. // Impasse : demi-tour.

262. else

263. {

264. this.direction = Direction.BAS;

265. this.y++;

266. }

267. }

268. // Case libre devant : déplacement selon la direction.

269. else if(this.y - 1 >= 0)

270. {

271. this.y--;

272. }

273. else

274. {

275. this.minuterie.stop();

276. }

277. break;

278. default:

279. break;

280. }

281. }

282. }

285. /**

286. * <p>Dessine la fenêtre.</p>

287. * @param g Le contexte graphique utilisé pour dessiner.

288. */

289. @Override

290. public void paint(Graphics g)

291. {

292. // Parcourt le labyrinthe.

293. for(int i = 0; i < this.labyrinthe.length; i++)

294. {

295. for(int j = 0; j < this.labyrinthe.length; j++)

296. {

297. // Case libre.

298. if(this.labyrinthe[i][j])

299. {

300. g.setColor(Color.WHITE);

301. g.fillRect(DEC_GAUCHE + j * TAILLE_CASE, DEC_HAUT + i * TAILLE_CASE,

302. TAILLE_CASE, TAILLE_CASE);

303. g.setColor(Color.LIGHT_GRAY);

304. g.drawRect(DEC_GAUCHE + j * TAILLE_CASE, DEC_HAUT + i * TAILLE_CASE,

305. TAILLE_CASE, TAILLE_CASE);

306. }

307. // Mur.

308. else

309. {

310. g.setColor(Color.BLUE);

311. g.fillRect(DEC_GAUCHE + j * TAILLE_CASE, DEC_HAUT + i * TAILLE_CASE,

312. TAILLE_CASE, TAILLE_CASE);

313. }

314. }

315. }

317. // Position courante dans le labyrinthe.

318. g.setColor(Color.RED);

319. g.fillOval(DEC_GAUCHE + 1 + this.x * TAILLE_CASE, DEC_HAUT + 1 + this.y * TAILLE_CASE,

320. TAILLE_PION, TAILLE_PION);

321. }

324. /**

325. * Invoqué quand une action se produit.

326. * @param e L'événement qui indique qu'une action s'est produite.

327. */

328. public void actionPerformed(ActionEvent e)

329. {

330. avancer();

331. repaint(DEC_GAUCHE + (this.x - 1) * TAILLE_CASE, DEC_HAUT + (this.y - 1) * TAILLE_CASE,

332. 3 * TAILLE_CASE, 3 * TAILLE_CASE);

333. }

336. /**

337. * <p>Commence l'exécution du programme.</p>

338. * @param args Les paramètres de la ligne de commande.

339. */

340. public static void main(String[] args)

341. {

342. new LabyrintheGraphique();

343. }

344. }

VIII - Remerciements

Je tiens à remercier keulkeul et kdmbella pour les conseils, remarques et relectures.
Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.