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...)
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 : 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 code du Thread est :
Le clignotement se vérifie dans la console par les affichages successifs :
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
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....
Partager