IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

[Swing] Gestion des ressources


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 142
    Points : 80
    Points
    80
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut 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)

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 142
    Points : 80
    Points
    80
    Par défaut 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 ?

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut 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.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 142
    Points : 80
    Points
    80
    Par défaut
    Je te remercie.
    A présent c'est beaucoup plus clair

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des ressources
    Par elflamby dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/09/2007, 14h59
  2. gestion des ressources utilisateurs
    Par edzodzinam dans le forum WebDev
    Réponses: 3
    Dernier message: 22/01/2007, 20h32
  3. Gestion des ressources processeur
    Par poussinphp dans le forum SDL
    Réponses: 5
    Dernier message: 30/05/2006, 15h42
  4. Gestion des ressources
    Par BainE dans le forum MFC
    Réponses: 2
    Dernier message: 11/01/2006, 11h55
  5. [DLL] Gestions des ressources textes (StringTable)
    Par Clorish dans le forum Langage
    Réponses: 1
    Dernier message: 26/05/2005, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo