[JAVA] Fenêtre fille ouverte/fermée ?
Fermé
PMOLIKUJ
-
19 avril 2012 à 15:27
flav1313 Messages postés 751 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 22 octobre 2012 - 23 avril 2012 à 13:35
flav1313 Messages postés 751 Date d'inscription mardi 24 août 2010 Statut Membre Dernière intervention 22 octobre 2012 - 23 avril 2012 à 13:35
A voir également:
- [JAVA] Fenêtre fille ouverte/fermée ?
- Jeux java itel ✓ - Forum Jeux vidéo
- Java runtime - Télécharger - Langages
- Java apk - Télécharger - Langages
- Scanf en java ✓ - Forum Java
- Java heap space ✓ - Forum Java
2 réponses
flav1313
Messages postés
751
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
22 octobre 2012
100
20 avril 2012 à 11:39
20 avril 2012 à 11:39
Au début de ta classe Fenetre A:
boolean fenetre_ouverte = false;
Dans l' actionPerformed de ton bouton:
if(!fenetre_ouverte){
new FenetreInterfaceB().setVisible(true);
fenetre_ouverte = true;
}
boolean fenetre_ouverte = false;
Dans l' actionPerformed de ton bouton:
if(!fenetre_ouverte){
new FenetreInterfaceB().setVisible(true);
fenetre_ouverte = true;
}
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
23 avril 2012 à 09:52
23 avril 2012 à 09:52
Au lieu de faire un new FenetreInterface à chaque fois, utilise toujours la même.
Et dans l'actionPerformed tu inverses la visibilité :
private final FenetreInterfaceB fiB = new FenetreInterfaceB(); private boolean fiB_visible = false;
Et dans l'actionPerformed tu inverses la visibilité :
fiB_visible = !fiB_visible; fiB.setVisible(fiB_visible);
flav1313
Messages postés
751
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
22 octobre 2012
100
23 avril 2012 à 10:08
23 avril 2012 à 10:08
Utiliser ce genre de technique est à mon gout néfaste car dans le cadre d'un petit programme, c'est forcément plus facile, mais dans le cadre d'un gros projet, tu utilises et consommes de la mémoire pour rien. Un programme Java est déjà lourd en soit alors une économie même infime de processus est toujours là bienvenu.
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
>
flav1313
Messages postés
751
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
22 octobre 2012
Modifié par KX le 23/04/2012 à 10:25
Modifié par KX le 23/04/2012 à 10:25
Effectivement mon code impose que la fenêtre soit toujours créé une fois, et ce même si on ne clique jamais sur le bouton, mais elle ne sera créée qu'une seule fois ! Alors qu'en faisant un new Fenetre dans l'actionPerformed tu créés autant de fois de fenetre que tu ne cliques sur le bouton, et à ce moment là ça consommera vraiment de la mémoire pour rien à partir du deuxième clic...
Une alternative à mon code serait donc de créer la fenêtre au premier clic, mais de conserver malgré tout cette fenêtre en mémoire pour les clics suivants :
dans l'actionPerformed :
Une alternative à mon code serait donc de créer la fenêtre au premier clic, mais de conserver malgré tout cette fenêtre en mémoire pour les clics suivants :
private FenetreInterfaceB fiB = null; private boolean fiB_visible = false;
dans l'actionPerformed :
if (fiB==null)
fiB = new FenetreInterfaceB();
fiB_visible = !fiB_visible;
fiB.setVisible(fiB_visible);
flav1313
Messages postés
751
Date d'inscription
mardi 24 août 2010
Statut
Membre
Dernière intervention
22 octobre 2012
100
23 avril 2012 à 10:26
23 avril 2012 à 10:26
Sachant que lorsqu'il a fini avec sa fenêtre un utilisateur la ferme. Elle se détruit et libère la mémoire qu'elle occupait.
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 004
23 avril 2012 à 10:36
23 avril 2012 à 10:36
"Elle se détruit et libère la mémoire qu'elle occupait."
Ça c'est de la théorie, et ce serait effectivement le cas en C++ où le destructeur est effectivement appelé mais avec le système de référence en Java c'est totalement différent, on a un ramasse-miettes mais celui-ci n'est appelé que quand le programme Java manque de la mémoire, ce qui signifie que tu pourras avoir 500 fenêtres créées puis inutilisées mais toujours en mémoire avant qu'elles ne soient effectivement libérées...
Tu peux par exemple tester ça en rajoutant des affichages dans la méthode finalize, qui est appelé quand le ramasse-miettes libère l'objet, et tu constateras ce que je viens de dire, c'est à dire que l'affichage (et donc la libération) ne se fait que lorsque le Java l'a décidé (quand il n'a plus de mémoire).
Ça c'est de la théorie, et ce serait effectivement le cas en C++ où le destructeur est effectivement appelé mais avec le système de référence en Java c'est totalement différent, on a un ramasse-miettes mais celui-ci n'est appelé que quand le programme Java manque de la mémoire, ce qui signifie que tu pourras avoir 500 fenêtres créées puis inutilisées mais toujours en mémoire avant qu'elles ne soient effectivement libérées...
Tu peux par exemple tester ça en rajoutant des affichages dans la méthode finalize, qui est appelé quand le ramasse-miettes libère l'objet, et tu constateras ce que je viens de dire, c'est à dire que l'affichage (et donc la libération) ne se fait que lorsque le Java l'a décidé (quand il n'a plus de mémoire).
batoune
Messages postés
538
Date d'inscription
jeudi 20 septembre 2007
Statut
Membre
Dernière intervention
4 avril 2017
96
23 avril 2012 à 10:39
23 avril 2012 à 10:39
En java on peut forcer le passage du ramasse miette, je n'ai plus la méthode exacte en tête mais je me souvient l'avoir déjà fait.
Sa doit être indiqué comment faire quelque part dans la doc officielle
Sa doit être indiqué comment faire quelque part dans la doc officielle
23 avril 2012 à 09:47
Merci pour ta réponse en tout cas !
23 avril 2012 à 09:52
Pour t'aider :
https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html