:oops: Bonjour ,
Quelle est la fonction java qui permet de fermer une fênetre en cours d'exécution?
Merci pour votre intention.
Version imprimable
:oops: Bonjour ,
Quelle est la fonction java qui permet de fermer une fênetre en cours d'exécution?
Merci pour votre intention.
Bonjour,
pour fermer une fenêtre, il y a 2 possibilités :[EDITION] J'ai écrit trop vite. Pour cacher une fenêtre, c'est évidemmentCode:
1
2 maJFrame.setVisible(true); // Cache la fenêtre (pour la réafficher plus tard) maJFrame.dispose(); // Détruit la fenêtre
Code:maJFrame.setVisible(false);
Sinon tu as aussi ça:
Ca permet de fermer ta JFrame quand tu clic sur la croix... Si c'est que tu veux ;)Code:
1
2 TaJFrame.setDefaultOperation(EXIT_ON_CLOSE);
Attention, avec EXIT_ON_CLOSE, c'est pas eulement la fenêtre que tu avs fermer, c'est l'entièreté du programme, cette constante correspond à un System.exit(0), et va tuer tous les Thread du programme, donc l'arrêter totalement.
Par contre dispose() fonctionne très bien...
( Pour setVisible(false), c'est mauvais, car tu ne libère pas les ressources de ta fenêtre, et surchearge donc la mémoire, mieux vaut faire dispose et la rapeller après)
Pas du tout d'accord !!! il y a beaucoup de cas où il vaut mieux garder la fenêtre en mémoire :Citation:
Envoyé par Razgriz
- ça prend du temps de construire une fenêtre...
- libérer des objets pour les recréer ensuite c'est pas forcement une bonne stratégie...
À noter qu'un programme écrit proprement ne doit jamais invoquer System.exit(...) lui-même (hormis en cas d'erreur super méga grave irrécupérable avec un code d'erreur différent de 0 mais c'est assez rare). Pour bien faire, il faut arrêter tous les threads non-démons. Swing/Java2D arrêtera ses propres threads lorsque toutes les fenêtres auront été détruites ("disposées"). La stratégie du setVisible(false) est très bonne à condition de ne pas oublier de faire un dispose() pour quitter l'application.
Si plusieurs Threads sont lancés, et que tu fais un dispose() sur l'unique JFrame, ça quitte tout le programme?Citation:
Envoyé par Gfx
Parce que en fait souvent je fais setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); et je fais un WindowListener qui lance une méthode exit() par exemple, et dans cette méthode exit() je fais quelques traitements, et je finis par System.exit(0);
Ca n'est pas correct?
Non, un dispose() sur l'unique JFrame arrète seulement l'event dispath thread...Citation:
Envoyé par ®om
Si tu as des threads en cours d'exécution et qu'ils ne sont pas des démons (voir setDaemon() dans la classe Thread) alors le dispose() ne fermera pas l'application. Il faut que lorsque toutes les fenêtres ont disparu il ne reste que des threads démons.
Ta solution marche très bien mais n'est pas la plus propre car tu peux avoir encore des threads qui tournent sans le savoir. En prenant l'habitude de quitter un programme sans appeler System.exit() on se force à programmer ses threads plus proprement. C'est une bonne manière d'améliorer la qualité d'un programme en fait.
Ca veut dire qu'il faut que je fasse une méthode "arrêter()" sur tous mes threads avant de quitter le programme avec un dispose() ?Citation:
Envoyé par Gfx
EDIT: Autre question, le Timer de javax.swing, c'est un démon ou pas?
(dans java.util.Timer on peut spécifier, mais dans javax.swing.Timer, je n'ai pas vu d'infos)
utilise meme la méthode suivante
maJFrame.hide() ;)
... qui est dépréciée ...Citation:
Envoyé par genius_.net