[JAVA] Fenêtre fille ouverte/fermée ?

PMOLIKUJ -  
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 !
A voir également:

2 réponses

flav1313 Messages postés 812 Statut Membre 100
 
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;
}
0
PMOLIKUJ
 
J'y avais pensé, mais comment remettre fenetre_ouverte à false après avoir fermé FenetreInterfaceB ?

Merci pour ta réponse en tout cas !
0
flav1313 Messages postés 812 Statut Membre 100
 
Tu crées un écouteur sur l'évènement WindowsClose de ta fenêtre de B et tu passes fenetre_ouverte à true.

Pour t'aider :

https://docs.oracle.com/javase/tutorial/uiswing/events/windowlistener.html
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Au lieu de faire un new FenetreInterface à chaque fois, utilise toujours la même.

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);
0
flav1313 Messages postés 812 Statut Membre 100
 
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.
0
KX Messages postés 19031 Statut Modérateur 3 020 > flav1313 Messages postés 812 Statut Membre
 
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 :

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);
0
flav1313 Messages postés 812 Statut Membre 100
 
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.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
"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).
0
batoune Messages postés 558 Statut Membre 96
 
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
0