[Swing] Gestion des ressources
Je suis en train de réaliser un programme qui contient un "wizard" c'est-à-dire qui affiche plusieurs fenêtres successivement sur lesquels on peut revenir.
Voici un schéma du code des deux fenêtres :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class A extends JDialog {
private B fenetreSuivante = null;
(...)
boutonSuivant.addActionListener(new ActionListener() {
setVisible(false);
if (fenetreSuivante == null) {
fenetreSuivante = new B();
fenetreSuivante.setVisible(true);
});
}
}
public class B extends JDialog {
private A fenetrePrecedente = null;
(...)
boutonPrecedent.addActionListener(new ActionListener() {
setVisible(false);
if (fenetrePrecedente == null) {
fenetrePrecedente = new A();
fenetrePrecedente.setVisible(true);
});
}
} |
En gros, à chaque fois que je clique sur le bouton suivant de la première fenêtre une nouvelle instance de la fenêtre est créée et la fenêtre actuelle est cachée (mais l'instance existe toujours).
De même, à chaque fois que je clique sur le bouton précédent de la deuxième fenêtre une nouvelle instance de la première fenêtre est créée et la fenêtre actuelle cachée.
Donc si je comprends bien le fonctionnement, des instances de chaque fenêtre vont sans cesse être créées tant que je fais suivant précédent, suivant précédent...
Comment puis-je gérer correctement la mémoire ?
Si j'utilise dispose() à la place de setVisible(false) la fenêtre est détruite mais l'instance toujours présente ?
Faut-il créer des singletons pour chaque fenêtre ?
En fait je voudrais savoir ce que fait dispose() sur une fenêtre et initialiser l'instance de la fenêtre à null (dans ce cas le garbage collector la récupère...?).
Quelqu'un peut-il m'éclaircir ?
Re: [Swing] Gestion des ressources
Citation:
Envoyé par speedster
Comment puis-je gérer correctement la mémoire ?
Si j'utilise dispose() à la place de setVisible(false) la fenêtre est détruite mais l'instance toujours présente ?
Autant que je puisse comprendre ton programme, l'instance n'est de toutes façons plus présente. Je ne sais pas si c'est voulu ou si c'est une erreur (je pense, une erreur, mais ce n'est pas clair). Pour le cas de ton programme, il serait bien vu que tu fasses un dispose après le setVisible(false). De toutes façons toutes les données seront perdues, donc autant que ce soit propre !
Citation:
Envoyé par speedster
Faut-il créer des singletons pour chaque fenêtre ?
Il y a 150 façons de faire un wizard. Une méthode peut être un peu plus classique que la tienne est de se créer une seule fenêtre, contenant les boutons suivant et précédent et tout le patin-couffin de la gestion du wizard, et, dedans, une JPanel dans lequel tu places, les uns à la suite des autres, les différents panneaux représentant les étapes de ton wizard.
Citation:
Envoyé par speedster
En fait je voudrais savoir ce que fait dispose() sur une fenêtre et initialiser l'instance de la fenêtre à null (dans ce cas le garbage collector la récupère...?).
Quelqu'un peut-il m'éclaircir ?
Le dispose libère la mémoire allouée pour le niveau système. Sauf cas exceptionnel (pas le tien), il ne faut pas mettre de référence à null pour aider le garbage collector.
Je pense qu'il faudrait déjà que tu éclaircisses la première question. 8)
Re: [Swing] Gestion des ressources
Citation:
Envoyé par tileffeleauzed
Autant que je puisse comprendre ton programme, l'instance n'est de toutes façons plus présente. Je ne sais pas si c'est voulu ou si c'est une erreur (je pense, une erreur, mais ce n'est pas clair). Pour le cas de ton programme, il serait bien vu que tu fasses un dispose après le setVisible(false). De toutes façons toutes les données seront perdues, donc autant que ce soit propre !
Quand tu dis que l'instance n'est plus présente, tu veux dire qu'elle n'est plus accessible mais présente en mémoire ?
D'où ma question concernant l'utilisation du singleton.
Il me semble que dans ce cas, j'accéderais en réalité toujours à la même instance et je n'en créerais pas de nouvelles.
Dans ce cas, est-ce que l'utilisation de dipose() s'avère judicieuse ?
Citation:
Envoyé par tileffeleauzed
Le dispose libère la mémoire allouée pour le niveau système. Sauf cas exceptionnel (pas le tien), il ne faut pas mettre de référence à null pour aider le garbage collector.
Je pense qu'il faudrait déjà que tu éclaircisses la première question. 8)
Le setVisible ne devrait être utilisé que lorsqu'on peut accéder à l'instance de la fenêtre cachée (ce qui n'est pas le cas de mon programme), n'est-ce pas ?
Quand tu dis que le dispose libère la mémoire allouée cela veut bien dire que l'instance de la fenêtre est détruite ?
Re: [Swing] Gestion des ressources
Citation:
Envoyé par speedster
Citation:
Envoyé par tileffeleauzed
Autant que je puisse comprendre ton programme, l'instance n'est de toutes façons plus présente. Je ne sais pas si c'est voulu ou si c'est une erreur (je pense, une erreur, mais ce n'est pas clair). Pour le cas de ton programme, il serait bien vu que tu fasses un dispose après le setVisible(false). De toutes façons toutes les données seront perdues, donc autant que ce soit propre !
Quand tu dis que l'instance n'est plus présente, tu veux dire qu'elle n'est plus accessible mais présente en mémoire ?
En gros oui. Sauf que, en Java, on ne sait pas maîtriser l'instant où une instance non accessible est effectivement supprimée de la mémoire.
Lorsqu'une instance n'est plus accessible, elle est dite éligible pour le ramasse miettes. Eligible par le ramasse miette est une expression plus appropriée que instance libérée de la mémoire. J'avais mis : instance plus présente, ce qui est un raccourci !
Citation:
Envoyé par speedster
D'où ma question concernant l'utilisation du singleton.
Il me semble que dans ce cas, j'accéderais en réalité toujours à la même instance et je n'en créerais pas de nouvelles.
Dans ce cas, est-ce que l'utilisation de dipose() s'avère judicieuse ?
Non, si vraiment tu emploies toujours la même instance de fenêtre, il ne faut surtout pas faire de dispose.
Citation:
Envoyé par speedster
Quand tu dis que le dispose libère la mémoire allouée cela veut bien dire que l'instance de la fenêtre est détruite ?
Non, pas du tout. Dans le cas d'une fenêtre, il y a deux sortes de mémoire : la mémoire allouée pour l'instance, et la mémoire allouée au niveau matériel pour afficher cette fenêtre à l'écran.
Pour libérer la mémoire allouée au niveau de la carte graphique, il faut utiliser le dispose. Pour libérer la mémoire allouée par l'instance, il faut simplement que cette instance ne soit plus accessible par ton programme.
Tu peux très bien libérer la mémoire reservée à l'instance, mais sans avoir libéré la mémoire réservée au matériel. Dans ce cas, tu n'as plus aucune possibilité de libérer cette dernière, et ton programme monopolise des ressource pour rien.