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...8O)
Pièce jointe 663648
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 :
Le Thread est crée et le label clignote bien!Code:
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 code du Thread est :
Le clignotement se vérifie dans la console par les affichages successifs :Code:
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
Pièce jointe 663650
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....