[JAVA] Fenêtre fille ouverte/fermée ?
PMOLIKUJ
-
flav1313 Messages postés 812 Statut Membre -
flav1313 Messages postés 812 Statut Membre -
Bonjour,
Je vous expose ma situation : à partir d'un bouton situé sur une interface A, j'aimerais qu'une fenêtre avec une interface B s'ouvre.
Dans la méthode actionPerformed, j'utilise cette ligne de code qui fait le traitement demandé :
new FenetreInterfaceB();
Seulement si je reclique sur le bouton, la fenêtre s'ouvre une deuxième fois (puis une troisième, etc) et c'est gênant pour le bon fonctionnement de mon application.
Ma question est donc la suivante : est-il possible de savoir depuis mon interface A si l'interface B est déjà ouverte, afin d'empêcher une n-ième ouverture ?
Je vous remercie par avance !
Je vous expose ma situation : à partir d'un bouton situé sur une interface A, j'aimerais qu'une fenêtre avec une interface B s'ouvre.
Dans la méthode actionPerformed, j'utilise cette ligne de code qui fait le traitement demandé :
new FenetreInterfaceB();
Seulement si je reclique sur le bouton, la fenêtre s'ouvre une deuxième fois (puis une troisième, etc) et c'est gênant pour le bon fonctionnement de mon application.
Ma question est donc la suivante : est-il possible de savoir depuis mon interface A si l'interface B est déjà ouverte, afin d'empêcher une n-ième ouverture ?
Je vous remercie par avance !
A voir également:
- [JAVA] Fenêtre fille ouverte/fermée ?
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Eclipse java - Télécharger - Langages
2 réponses
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;
}
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);
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.
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);
"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).
Merci pour ta réponse en tout cas !
Pour t'aider :
https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html