Bonjour,
Je voulais savoir si ,quand je fais un Thread d'une JFrame,faire un dispose() de la JFrame suffise à arrêter le thread ou va t-il tourner en rond?
Code:
1
2
3 Thread t= new Thread(MaJframe); t.start(); MaJframe.dispose();
Version imprimable
Bonjour,
Je voulais savoir si ,quand je fais un Thread d'une JFrame,faire un dispose() de la JFrame suffise à arrêter le thread ou va t-il tourner en rond?
Code:
1
2
3 Thread t= new Thread(MaJframe); t.start(); MaJframe.dispose();
Je ne vois pas bien comment cela peut fonctionner car
dans ton code, tu indique mettre ton JFrame comme objectif (target) du Thread (voir doc)
Or quand on écritil faut que MonObjet implémente Runnable ce qui n'est pas le cas de JFrame.Code:Thread t= new Thread(MonObjet);
Si tu veux l'ouvrir dans un process séparé, tu peux très bien faire :
(code proposé par NetBeans chaque fois qu'on veut utiliser un JFrame)Code:
1
2
3
4
5
6 java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MaJframe().setVisible(true); } });
Bonjour,
le Runnable est installé.
J'ai juste mis les trois lignes que je trouve importante,
Mon problème n'est pas le démarrage de la fenêtre. Mais l’arrêt de celle si:
Est ce que si je ferme grâce au dispose(), ma fenêtre ET mon thread s'arrête ou juste la fenêtre.
Comme il est déconseillé d'utilise .stop() du Thread je cherche a faire autrement.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public class MaJFrame extends JFrame implements Runnable{ //Avant création du JFrame+ initialisation... public void run(){ setVisible(true); } } public void MonCode(){ MaJframe mj= new MaJframe(); Thread t = new Thread(mj); t.start(); //Mon traitement mj.dispose(); }
Merci à tous ceux qui se pencheront sur mon problème. :ccool:
Le setVisible d'une JFrame ne doit surtout pas être réalisé dans un Thread lambda mais uniquement dans l'EventDispatchThread lui même au moyen d'un appel à SwingUtilities.invokeLater.
En ce qui concerne l'interaction Swing/Threading, la lecture du tutoriel suivant est impérative: http://gfx.developpez.com/tutoriel/j...ing-threading/
non le thread ne s'arrête pas. Tu met deux choses différentes dans un même objet, mais ça reste deux choses différentes. Pour arrêter le thread, il faut que ta méthode run() retourne. Donc c'est dans ta méthode run() qu'il faut mettre la logique pour détecter que la frame et fermée et donc arrêter le travail.
La technique la plus courante c'est de mettre un booléen "finish" à true et de le lire dans le thread. Mais tu dois coder tout ça, ce n'est pas automatique.
Merci pour les deux réponses,
Je regarde le tutoriel dès que possible.Car j'ai quand même de trois JFrame à coder comme ça.
Pour aller plus loin, tu peux nous dire pourquoi tu as envie de mettre un JFrame dans un Thread ?
Il faut avoir un sérieux motif !
Peu être que je fais une erreur,
mais quand je lance à partir d'un programme une JFrame, le reste du programme est bloqué, alors que je ne veux justement pas.Donc j'ai penser a utilisé les thread.
Précisément, je préviens à l'aide de cette JFrame l'état du programme en question, Comme la température de ma machine, la tension qui en sort etc. tout en devant les traiter à coté et faire d'autre action.
Ma JFrame n'est qu'un affichage mis à jour à l'aide d'Observable/Observer.
En espérant avoir répondu à ta question.
Bon comme tu m'as mis le doute, j'ai réessayé de lancer juste avec la JFrame. Et sa fonctionne....
Je suis vraiment un boulet. En plus, je suis passé en JDialog justement pour que certaines deviennent bloquante(je m'en rappelai plus)....
Bon bin, désolé de vous avoir tous dérangé pour rien finalement.
Et merci à tous :ccool:
En fait, toutes les opérations Swing se déroulent dans un Thread spécifique appelé Event Dispatch Thread.
A vrai dire, il est même fortement recommandé d'instancier et rendre visible ta JFrame directement dans ce thread en englobant ses opération dans un SwingUtilities.invokeLater.
Le Threads deviennent utilises dès lors que tu effectues des opérations longues/bloquantes depuis ton interface graphique. En effet, il est préférable d'éviter de faire ce genre d'opérations directement dans un Listener, mais plutôt de lancer un Thread effectuant ces opérations depuis le listener.
Tu en sauras plus après la lecture du tutorial dont j'ai donné le lien.