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

Interfaces Graphiques en Java Discussion :

Sauver avant de fermer


Sujet :

Interfaces Graphiques en Java

  1. #1
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut Sauver avant de fermer
    Bonjour,

    J'essaie d'afficher une fenêtre de dialogue qui demande à l'utilisateur s'il veut sauver son tavail une fois il a cliqué sur x pour fermer l'application. Le code est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
             JFrame frame = new JFrame("FullFantastic");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setContentPane(app);
     
            frame.addWindowListener(new WindowAdapter(){
               public void windowClosing(WindowEvent e)
               {
                    new javax.swing.JDialog(frame,"tttt",true);
                    System.exit(0);
               }
                });
    Le problème est que j'ai l'erreur de compilation suivante : "Impossible de faire référence à une variable non finale frame d'une classe définie dans une méthode différente".

    Est ce que quelqu'un saurait me dire comment faire ? Ca doit être courant de faire ça.

    Merci bien

  2. #2
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    C'est un peut goret ton code.

    Il est préférable de faire une nouvelle classe enfant de JFrame et de surdéfinir la méthode dispose.

    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
     
     
    public class MainFrame  extends JFrame {
        public MainFrame(JPanel app) {
            super("FullFantastic");
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setContentPane(app);
        }
     
        @Override
        public void dispose() {
            // Ici ton code à executer à la fermeture.
            super.dispose();
        }
     
    }
    Je n'ai pas testé, mais je ferai un truc du genre...

    A+

  3. #3
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Quand à ton erreur, c'est une erreur de porté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new javax.swing.JDialog(frame,"tttt",true);
    frame n'est pas membre de ta classe déclarée en ligne, donc impossible a trouver.

    La déclaration de Classe à la volée c'est pas top, car tu te limites beacoup, et ton code devient très lourd ( rien que la flopé de {{}} c'est un calvert.

    A+

  4. #4
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci pour ta réponse.
    En effet, cette façon de faire est bien plus élégante. Je l'adopte :
    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
     
    class MyFrame  extends JFrame {
    	Fan fan;
     
        public MyFrame(Fan app) {
            super("FullFantastic");
            fan = app;
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setContentPane(app);
        }
        public void dispose() {
                	SaveDialog saveDialog = new SaveDialog(this);
                	saveDialog.setVisible(true);
            	super.dispose();
                    System.exit(0);          
        }
    }
    Le problème est que lorsque j'appuie sur le X de la fenêtre principale de mon application, cette fenêtre disparaît avant l'apparition du dialog SaveDialog et le message qu'il contient. Le message doit normalement être affiché avant que la fenêtre principale disparaisse (exemple le comportement de notepad).

    Est ce que tu as une suggéstions là-dessus ?

  5. #5
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Je pense que ceci devrait te convenir :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    class MyFrame  extends JFrame {
    	Fan fan;
     
        public MyFrame(Fan app) {
            super("FullFantastic");
            fan = app;
            //On retire DISPOSE_ON_CLOSE, on va le gérer nous même.
            //setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            //Le this n'est pas utile car setDefaultCloseOperation est membre.
            setContentPane(app);
        }
     
        //On abandonne la surdéfinition de dispose.
        /*public void dispose() { 
                	SaveDialog saveDialog = new SaveDialog(this);
                	saveDialog.setVisible(true);
            	super.dispose();
                    System.exit(0);          
        }*/
     
        //Le fait de cliquer sur la croix appel setVisible avec false.
       //On va donc le surdéfinir.
       public void setVisible(boolean b) {
     
            if ( !b ) {
                //Ici le code de fermeture. 
                SaveDialog saveDialog = new SaveDialog(this);
                saveDialog.setVisible(true);
     
                //Ici tu test la réponse de dialogbox. moi je met res = true;
                boolean res = true;
     
                if ( res ) { //Oui on sauvegarde.
                    super.setVisible(false); //On cache la fenêtre
                    dispose(); // et on la détruit.
                    //Ici tu peux mettre le exit(1), mais c'est pas très propre.
                   // C'est plustot la classe appelante qui devrais le faire.
                } else { //Non faut pas !!!
                    return; //Donc je ne fait rien.
                    //Donc ma fenêtre reste visible. J'ai annulé le clic sur la croix.
                }
     
            } else {
                //J'autorise l'affichage de la fenêtre sans conditions.
                super.setVisible(b);           
            }
     }
     
    }

  6. #6
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Je te conseil aussi de jeter une coup d'oeil sur les possibilité de setDefaultCloseOperation(operation) sur la javadoc, car cette fonction offre des options parfois très utiles !

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Si par fermer l'application tu veux dire "quitter la JVM", je te conseille lecode suivant....

    Apres la creation de ton frame, tu ajoutes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Ce qui indique a SWING de faire un System.exit() quand on ferme la fenetre.

    Ensuite, dans ta classe principale (celle du main) tu definis une classe imbriquée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class MyShutdownHook extends Thread {
        public void run() {
            // System.out.println("SHUTDOWN IN PROGRESS");
            // mettre ici le code executé lors du System.exit
        }
    }
    et au debut du main() tu ajoutes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
    Comme ca, tu es sur que ton code est executé a l'arret de la JVM, quelle que soit la raison de l'arret (fermeture de fenetre, exception, bouton "stop" dans eclipse, ...)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Je ne crois pas que c'est ce qu'il souhaite faire, mais je connaissais pas !

    C'est sympa ca !

  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
    Par défaut
    Ou tout simplement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JFrame#addWindowListener(WindowListener)

  10. #10
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci beaucoup pour vos réponses. Ils m'ont été très utiles.

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

Discussions similaires

  1. comment faire un test avant de fermer la fenetre
    Par muslim1987 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/06/2008, 14h43
  2. Attendre que tous mes invoke soient finis avant de fermer ma fenêtre
    Par Rodrigue dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 20/02/2008, 20h14
  3. Vérifier la saisie avant de fermer un formulaire
    Par fransous dans le forum IHM
    Réponses: 2
    Dernier message: 07/02/2007, 19h31
  4. [resolulu][SWING] action avant de fermer une JFrame
    Par berg dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 17/06/2006, 23h15
  5. Confirmation avant de fermer une fenetre
    Par Dauphin dans le forum C++Builder
    Réponses: 10
    Dernier message: 26/05/2005, 00h27

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