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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 !

+ 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