Salut tout le monde,
J'ai le code suivant :
J'ai une animation dans un JPanel. J'utilise un Timer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import javax.imageio.ImageIO; import javax.swing.JPanel; public class PanelAnimation extends JPanel { // Un tableau d'images private BufferedImage[] tableauImages = null; // Un nombre d'images public static final int NOMBRE_IMAGES = 7; // L'image en cours private BufferedImage imageEnCours = null; // Le Timer pour l'animation private Timer minuteur = null; // La tâche du minuteur private TimerTask tache = null; public PanelAnimation() { // On associe un layout this.setLayout(new BorderLayout()); // On associe une taille au panelAnimation this.setPreferredSize(new Dimension(200, 200)); // On déclare le tableau d'images (7 images) tableauImages = new BufferedImage[NOMBRE_IMAGES]; // On charge les images chargeImages(); // On instancie l'image en cours par défaut imageEnCours = tableauImages[0]; // On instancie un minuteur pour l'animation minuteur = new Timer(); // On définit une tâche pour le minuteur tache = new TimerTask() { // On lance l'animation dans un nouveau Thread @Override public void run() { // On lance l'animation lanceAnimation(); } }; // On définit l'emploi du temps du minuteur : // - suivre la tâche lanceAnimation() // - à partir de maintenant // - toutes les 50ms minuteur.schedule(tache, 0, 50); } public void chargeImages() { // Pour toutes les images for (int i = 0; i < NOMBRE_IMAGES; i++) { try { // On charge l'image tableauImages[i] = ImageIO.read(new File("./src/fr/" + "apreslaclasse/alcgged/images/" + i + ".jpg")); } catch (IOException exception) { // On affiche la pile d'appel exception.printStackTrace(); // On affiche un message System.out.println("L'image " + i + ".jpg " + "n'a pas été lue"); } catch (IllegalArgumentException exception) { // On affiche la pile d'appel exception.printStackTrace(); // On affiche un message System.out.println("Le fichier image " + i + ".jpg " + "est null"); } catch (NullPointerException exception) { // On affiche la pile d'appel exception.printStackTrace(); // On affiche un message System.out.println("L'image " + i + ".jpg " + "n'a pas été trouvée"); } } } public void lanceAnimation() { // TODO: Faire ça dans une boucle // Si l'image en cours est la première image if (imageEnCours.equals(tableauImages[0])) { // On change l'image en cours imageEnCours = tableauImages[1]; // On affiche l'image this.repaint(); // Si l'image en cours est la seconde image } else if (imageEnCours.equals(tableauImages[1])) { // On change l'image en cours imageEnCours = tableauImages[2]; // On affiche l'image this.repaint(); // Si l'image en cours est la troisième image } else if (imageEnCours.equals(tableauImages[2])) { // On change l'image en cours imageEnCours = tableauImages[3]; // On affiche l'image this.repaint(); // Si l'image en cours est la quatrième image } else if (imageEnCours.equals(tableauImages[3])) { // On change l'image en cours imageEnCours = tableauImages[4]; // On affiche l'image this.repaint(); // Si l'image en cours est la cinquième image } else if (imageEnCours.equals(tableauImages[4])) { // On change l'image en cours imageEnCours = tableauImages[5]; // On affiche l'image this.repaint(); // Si l'image en cours est la sixième image } else if (imageEnCours.equals(tableauImages[5])) { // On change l'image en cours imageEnCours = tableauImages[6]; // On affiche l'image this.repaint(); // Si l'image en cours est la septième image } else if (imageEnCours.equals(tableauImages[6])) { // On change l'image en cours imageEnCours = tableauImages[0]; // On affiche l'image this.repaint(); // ICI : tache.cancel(); } } @Override public void paintComponent(Graphics g) { // On affiche l'image en cours dans le panel g.drawImage(imageEnCours, 0, 0, this); } }
A partir du Thread du TimerTask, je lance une méthode (lanceAnimation()).
Quand j'exécute mon code comme cela, je vois bien l'animation qui fait des tours et des tours de boucle. Mais du coup, le Thread ne s'arrête plus ! A un moment, plus tard dans le code, je ferme la fenêtre qui gère ce JPanel (avec dispose()) mais le Thread continue encore de tourner ! Pourquoi ?
Sinon, si je mets le code suivant : tache.cancel(); au commentaire rouge (voir plus haut dans mon code), l'animation fait un tour et s'arrête, le Thread a l'air également de s'arrêter. Cependant, c'est comme si le Thread lançait l'animation à partir de la méthode lanceAnimation() 7 fois (autant que le nombre d'images)... Bizarre, non ?
Partager