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

Langage Java Discussion :

[debutant] sauvegarde des préférences


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut [debutant] ShutownHook - sauvegarde des préférences
    Bonjour,

    Je cherche à sauvegarder des préférences utilisateur.
    J'utilise pour cela la classe Preferences , les méthodes .put et .get :

    Preferences pref = Preferences.userRoot();
    ...
    pref.put("nom", name);
    ...
    String s=pref.get("nom","");


    (C'est pas du code... c'est juste pour montrer ce que j'utilise, tout bêtement d'ailleurs)

    Mon problème est le suivant : ça fonctionne très bien sous Windows et Linux. Par contre avec un Mac, ben pas du tout (retour utilisateur)

    Je n'ai pas de Mac et n'y connais donc rien. Je ne sais pas si le problème vient du "put" ou du "get" ou d'ailleurs....

    Auriez-vous une explications, SVP ? :-)

    Merci

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Tu exécutes ça quand tu fermes la fenêtre (WindowListener)?

    Si oui, c'est parce que sous MAC, si tu cliques sur la fenêtre, ça tue le processus... (il y a un moyen sous mac de le fermer correctement, mais en cliquant, ça tue)...

    Il faut gérer un Hook à la main, etc...

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Salut Rom,

    Merci de ta réponse. Effectivement, c'est à la fermeture de la fenêtre que je lance la méthode qui sauve les préférences...

    "Gérer un hook à la main", ça veut dire quoi ? C'est si compliqué à faire ?

    Je vais rechercher de ce côté en tous cas.

    Merci, a+

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Regarde la méthode exit() de la classe org.myfreetv.view.MyFreeTV et le windowlistener de org.myfreetv.view.MainFrame ici:
    ftp://myfreetv3:dev@rom1v.myftp.org/src/

    D'ailleurs, plutôt la méthode readResolve() qui crée le hook...

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Bon je me suis un peu documenté sur Runtime.addShutDownHook ; par contre pour ton code, là c'est fermé :-)

    Voici donc le bout de code concerné :

    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
    32
     
    public MainFrame() {
       super();
     
       this.prefs = Preferences.userRoot();
       this.initialize();
       this.setVisible(true);
       this.loadPreferences();
    }
     
    private void initialize() {
       this.setSize(640, 480);
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
     
       Thread hook = new Thread("ShutdownHook"){
            public void run(){
    	savePreferences();
                 System.out.println("HOOK OK");
            }
       };
       Runtime.getRuntime().addShutdownHook(hook);
     
       this.setResizable(false);
       this.setContentPane(getJContentPane());
       this.setTitle("Version 2");
    //this.addWindowListener(new java.awt.event.WindowAdapter() {
    //	public void windowClosing(java.awt.event.WindowEvent e) {
    //		savePreferences();
    //	}
    //});
    }
    Malheureusement je n'ai pas de Mac ni de Maciste sous la main pour tester. Par contre, quand je quitte l'appli "normalement" en fermant la fenêtre, le hook est bien exécuté, ce qui semble ne pas être le cas autrement :

    par exemple sous eclipse en cliquant sur "terminate", la console ne me sort pas "HOOK OK"

    Merci de votre aide

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En même temps quand tu fais ça sous eclipse tu tue le process java, donc forcément...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par sinok
    En même temps quand tu fais ça sous eclipse tu tue le process java, donc forcément...
    Justement, c'est à ça que sert le hook, exécuter un code rapide avant d'être tué....

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Et je confirme que ça a le même effet en lançant depuis un Jar executable -> ça ne sauvegarde que lorsque je quitte par la fermeture de la fenêtre.

    Pourtant mon code semble conforme à ce que j'ai pu trouver en cherchant

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par absolut75
    Et je confirme que ça a le même effet en lançant depuis un Jar executable -> ça ne sauvegarde que lorsque je quitte par la fermeture de la fenêtre.

    Pourtant mon code semble conforme à ce que j'ai pu trouver en cherchant
    Tu as regardé les classes MyFreeTV et MainFrame (mon pc est rallumé)?

    En fait, si la fenêtre est fermée normalement (avec WindowListener), je désactive le hook et sauve les préférences, sinon, si c'est tué, bah c'est le hook qui doit faire son travail et sauver les préférences (avec une contrainte de temps, ça doit s'exécuter très rapidement)...

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Salut Rom,

    Oui j'ai regardé tes sources et m'en suis inspiré ;-) merci !

    Mais là le problème, c'est que justement le hook ne s'exécute que quand on ferme la fenêtre. (et donc ça ne résoudrait pas mon bug sous Mac, d'après ce que tu me disais au début)

    Je n'ai pas besoin de faire un distinguo "fermeture fenêtre" vs. "fermeture autre" puisque le seul traitement que je veux faire c'est de sauver les preferences.

    Je ne vois pas ce qui ne va pas dans mon code, sauf à n'avoir pas bien capté le fonctionnement de addShutdownHook....qui correspond pour moi aux dernières actions à faire avant de mourir, quelle que soit la méthode de l'assassin.

    D'autres idées ?

    a+

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Dans ton code, il y a un problème déjà à ce niveau, si tu ne charges pas lafenêtre dans l'EDT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.setVisible(true);
    this.loadPreferences();
    setVisible est bloquant (hors EDT), et donc si tu tues au moment de fermer la fenêtre, loadPreferences ne sera jamais appelé...

    Je n'ai pas besoin de faire un distinguo "fermeture fenêtre" vs. "fermeture autre" puisque le seul traitement que je veux faire c'est de sauver les preferences.
    Oui, mais si la fenêtre est fermée correctement, il vaut mieux ne pas utiliser le hook qui a des contraintes de temps (qui fait que si le pc rame et que ton action est lente, ça ne marche pas bien)...

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Ok merci pour ces précisions.
    Par contre je ne vois toujours pas pourquoi c'est hs à la sortie...

    Du coup je vais essayer de faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
     
    //[....]
     
    this.addWindowListener(new java.awt.event.WindowAdapter() {
    	public void windowClosing(java.awt.event.WindowEvent e) {
    		savePreferences();
                System.exit(0);
    	}
    });
    En priant pour que ça fonctionne sur Mac...

    a+

  13. #13
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par absolut75
    Ok merci pour ces précisions.
    Par contre je ne vois toujours pas pourquoi c'est hs à la sortie...

    Du coup je vais essayer de faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
     
    //[....]
     
    this.addWindowListener(new java.awt.event.WindowAdapter() {
    	public void windowClosing(java.awt.event.WindowEvent e) {
    		savePreferences();
                System.exit(0);
    	}
    });
    En priant pour que ça fonctionne sur Mac...

    a+
    Tu as juste à faire ça, mais en plus, tu fais un hook qui fait aussi savePreferences()...

    (et dans ton WindowAdapter, désactive le hook, sinon System.exit() va exécuter le hook...)

  14. #14
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 86
    Points : 49
    Points
    49
    Par défaut
    Ca marche nickel !

    Encore merci , a+

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

Discussions similaires

  1. [OL-2007] sauvegarde des préférences utilisateurs
    Par deglingo592003 dans le forum VBA Outlook
    Réponses: 0
    Dernier message: 12/06/2009, 14h57
  2. meilleur solution de sauvegarde des préférences
    Par gargantua dans le forum Général Java
    Réponses: 5
    Dernier message: 20/01/2009, 11h05
  3. [debutant]sauvegarde des valeurs dans un formulaire
    Par pimousse_cerise dans le forum JSF
    Réponses: 7
    Dernier message: 15/06/2007, 09h56
  4. [Debutant] Sauvegarder des données
    Par ArHacKnIdE dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 16/11/2006, 20h00
  5. sauvegarde des Préférences
    Par menuge dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2006, 08h57

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