J'ai une JFrame principale statique, nommée "fenetre1", appartenant à la classe" RunTest".
Cette fenetre affiche un Quizz, posant différentes questions dans des domaines techniques.

A la sélection du Quizz, on affiche des labels qui ont le rôle suivant :
- en gris, le nombre total de question disponibles dans le domaine.
- en orange avec un numéro, le nombre de question choisi pour ce quizz.
En gros ca ressemble à ca (oui je sais, il y aura encore du travail de présentation, mais pas le sujet du jour...)
Nom : labelsQuizz.png
Affichages : 73
Taille : 19,1 Ko

Quand je clique sur le bouton "démarrer" (au bas de la JFrame, non visible sur la photo ci-dessus), je démarre le quizz. (pour le moment, uniquement la question "q0")
Je fais alors appel à un Thread, qui permet de faire clignoter le label de la question en cours. Le code sur le bouton "démarrer" est le suivant :
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
// Action sur BP DEMARRER
										private static void appuiDémarrer() {
												System.out.println("on a démarré le quizz.");		
												démarrer.setEnabled(false);
												anim = true;
 
											//	for (int q=0; q<qtne.getNbQuestions(); q++) {
													int q = 0;
													Question question = qtne.getListeQuestions()[q];
													énoncé.setText(question.getEnoncé());
													MesThreads  thread = new MesThreads(q);
													thread.start();
 
											//	}
										}
Le Thread est crée et le label clignote bien!
Le code du Thread est :
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
// --- Méthode Run() ---
	public void run() {
 
		boolean clignotant = false;
 
						while ((RunTest.anim) && (RunTest.fenetre1.isDisplayable())) {			// tant que la question est posée...
							System.out.println("on est dans la question d'index " + q);
							System.out.println("la fenetre principale  vaut : " + RunTest.fenetre1.isDisplayable());
 
							if (clignotant) {
								RunTest.jlabels[q].setBackground(Color.red);
							}
							else {
								RunTest.jlabels[q].setBackground(Color.WHITE);
							}
							RunTest.jlabels[q].repaint();
 
							  try { Thread.sleep(500); }
							  		catch (InterruptedException e) {e.printStackTrace();}
 
							clignotant = !clignotant;
						}	// fin du while	
	}  // fin de run
Le clignotement se vérifie dans la console par les affichages successifs :
Nom : consoleThreadOK.png
Affichages : 66
Taille : 5,8 Ko

Je souhaite cependant avoir la main sur la fermeture du Thread.
Pour cela, j'ai utilisé un "while", pour m'assurer que :
- la variable "anim" est "true", c'est à dire qu'on est bien en train de réfléchir à une question posée.
- la fenêtre principale est toujours ouverte. En effet, si on ferme la fenetre principale, je n'ai pas envie que des threads continuent à tourner en arrière plan..

C'est là que la question se pose..

1/ dans la condition du "while", j'ai testé "RunTest.fenetre1 != null" et "RunTest.fenetre1.isDisplayable()", et aucune de ces deux conditions ne semble passer à "false", pour interrompre mon thread, quand je ferme "RunTest.fenetre1", qui est pourtant positonnée sur "DisposeOnClose"...
Pourquoi la JFrame libérée reste sur les valeurs "true", pour "!=null" et "isDisplayable()"?

2/ Puis-je personnaliser le code effectué à la fermeture de la fenetre, pou y ajouter un variable de classe, qui passerait alors à false, et que je surveillerai pour mon thread?
Dois-je utiliser "overide"? Comment trouver la bonne syntaxe?

Merci à ceux qui auront tenu jusqu'au bout....