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

Java Discussion :

Problème fermeture de fenetre


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut Problème fermeture de fenetre
    Bonjour à tous,

    Je reviens vers vous avec un ultime problème.
    J'ai sur mon application, un JButton qui lors d'un clic dessus, ouvre une nouvelle fenêtre contenant une JTable chargé par des données d'une base de données.

    Lorsque j'ouvre ma fenêtre pour la première fois au lancement de l'application, pas de soucis, le tableau se remplit bien, je la referme, et si je l'ouvre directement après, le tableau est remplit mais en double !

    Le problème vient certainement de la méthode de fermeture de la fenêtre.

    J'ai donc d'abord essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Sauf que toute l'application se ferme, j'ai donc essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    Mais la, la fenêtre se ferme, mais ne se "détruit" pas, je me retrouve toujours avec un tableau remplit en double ...

    Pour le EXIT_ON_CLOSE, c'est plutôt normal d'obtenir ce résultat, mais je trouve ceci plus bizarre avec le DISPOSE_ON_CLOSE qui est censé détruire la fenêtre non ?

    Je suis à cours d'idées :/

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par H4rDBuG Voir le message
    mais je trouve ceci plus bizarre avec le DISPOSE_ON_CLOSE qui est censé détruire la fenêtre non ?
    Non : le dispose libère seulement les ressources de la fenêtre lié au système d'exploitation. En aucun cas il ne détruit l'objet Java. Si tu ré-affiches la même fenêtre ces ressources seront recréé...




    D'après ce que tu dis, je suppose que tu crées la fenêtre/table une seule fois, et que tu y ajoutes des données à chaque fois que tu l'affiches.


    As-tu réellement besoin de conserver la fenêtre une fois fermée et de conserver sa référence ?

    Il serait plus simple de ne pas la conserver une fois fermée, et de la recréer si besoin...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Merci adiGuba de ta réponse, c'est exactement ce que je veux faire, mais je ne connais pas la méthode pour la supprimer à la fermeture ...

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Un petit remove() ou removeAll() sur le panel contenant la JTable. Ensuite tu enchaîne avec le dispose et le tour devrait être joué

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par H4rDBuG Voir le message
    Merci adiGuba de ta réponse, c'est exactement ce que je veux faire, mais je ne connais pas la méthode pour la supprimer à la fermeture ...
    Ben tu dois conserver la référence quelque part. Il suffit de ne pas le faire...


    Après sans voir ton code c'est difficile de t'aider plus !


    a++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Je vois pas trop ou placer le remove(), du fait que j'appelle la méthode setDefaultCloseOperation(), je ferme la fenêtre avec la croix rouge

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Voila le code ma classe tabCategorie (qui ne contient que mon JTable avec 2 boutons
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    package gestionintendance;
     
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.print.PrinterException;
    import java.io.File;
    import java.io.IOException;
    import javax.swing.*;
    import javax.swing.table.*;
     
    public class tabCategorie
    {
        static String[] titreColonnes = {"NomCategorie"}; 
     
        public tabCategorie(Object[][] donnees, String[] titreColonnes,String titre)
        {
    	JFrame frame = new JFrame(titre);
     
    	DefaultTableModel model = new DefaultTableModel(donnees,titreColonnes);
    	final JTable jt = new JTable(model);
     
            jt.getColumnModel().getColumn(0).setPreferredWidth(200);
     
            JButton print = new JButton("Imprimer");
     
            print.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent evt) 
                {
                    try 
                    {                
                        jt.print();
                    } 
                    catch (PrinterException ex) 
                    {
                        System.out.println(ex.getMessage());
                        System.out.println(ex);
                    }
                }
    	});
     
            JButton export = new JButton("Exporter vers excel");
     
            export.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent evt) 
                {
                    try 
                    {                
                        String user = System.getProperty("user.name");
                        ExcelExporter exp = new ExcelExporter(); 
                        exp.exportTable(jt, new File("C:/Users/"+user+"/Desktop/fiche-categorie.xls"));
                    } 
                    catch (IOException ex) 
                    {
                        System.out.println(ex.getMessage());
                        System.out.println(ex);
                    }
                }
    	});
     
            JPanel pan = new JPanel();
    	JScrollPane pane = new JScrollPane(jt,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            pane.setPreferredSize(new Dimension(200,300));
            pan.add(pane);
            pan.add(print);
            pan.add(export);
    	frame.add(pan);
    	frame.pack();
            frame.setLocationRelativeTo(null);
    	frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    j'appelle l'ouverture de cette fenêtre de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabCategorie t = new tabCategorie(Categorie.getCategorie(Categorie.getAll()),tabCategorie.titreColonnes,"Consultation des categories");

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Mise à part la façon dont tu as architecturé ton programme, je ne vois pas de problème.
    Ton "truc" avec titreColonne est juste un peu bizarre. Pourquoi le passer en paramètre ??
    Au pire tu peux toujours ajouter un WindowListener et sur l'evenement windowClosed, tu mets ton model à null. Mais si ça marche, je suis curieux de savoir pourquoi

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Bah enfait, j'ai préféré créer une classe à part entière, car j'ai une fenetre pour les catégories, mais aussi pour les produits, les fournisseurs etc.
    Quand au fait de passer les titres en paramètres, je trouve cela plus simple pour une méthode de ne lui passer qu'une variable, plutôt qu'un pavé de String[] ...

    Comment aurais-tu structurer le programme ?

  10. #10
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    A mon avis, ton probleme ne vient pas de la fenetre mais plutot des données qui lui sont envoyées.

    Est ce que tu pourrais montrer le code qui crée le fameux "Object[][] donnees" passé en parametre (en partant du resultset) ?
    Je me demande si ce n'est pas stocké quelque part (par exemple un ArrayList) puis, à l'ouverture de la 2e fenetre, la requete serait executée une 2e fois et les données ajoutées...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Ah effectivement, une piste que je n'avais pas envisagée :

    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
     
     static ArrayList<Categorie> getAll()
        {
            String sql = "select NomCateg from Categorie;";
            try
            {
                Statement stmt = (Statement) new BDD().connStocks.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
     
                Categorie categ = null;
     
                while(rs.next())
                {
                    categ = new Categorie();
                    categ.setNomCateg(rs.getString(1));
                    listeCategorie.add(categ);
                }
            }
            catch(SQLException e)
            {
                System.out.println(e);
            }
            return listeCategorie;     
        }
     
        private Object[] toTab()
        {
    	Object[] ligne = new Object[1];
    	ligne[0] = NomCateg;
            return ligne;
        }
        static Object[][] getCategorie(ArrayList<Categorie> alc)
        {
     
    	int n=alc.size();
    	Object[][] donnees =  new Object[n][]; 
    	int i=0;
    	for(Categorie c : alc)
            {
    		donnees[i]=c.toTab();
    		i++;
    	}
    	return donnees;
        }
    Voilà les méthodes de la classe catégorie utiles au JFrame

  12. #12
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeCategorie.add(categ);
    Tu ajoute bien un "categ" à ta liste mais il n'est jamais supprimé.
    Et comme je suppose que listeCategorie est static et bien il utilise tout le temps le même.

    Soit tu recrée une nouvelle liste à chaque fois, soit tu supprime les éléments de la liste avec d'en rajouter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Categorie> listeCategorie = new ArrayList<Categorie>();
    listeCategorie.add(categ);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listeCategorie.remove(); // Ou quelquechose comme ça
    listeCategorie.add(categ);
    ps : Il y a pas mal de static dans ton code. Tu pourrais t'en passer, parce que le static ça peux vite devenir LE MAL

  13. #13
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    +1

    Dans getAll() tu rajoutes des éléments dans une "listeCategorie" dont on se sait rien ?
    Elle est static ? Dans ce cas à chaque appel à la méthode tu rajouteras des données déjà présente


    La liste devrait être créé dans la méthode à chaque appel !



    Sinon ta gestion de la BDD est catastrophique : tu ne libères jamais tes ressources !!!!

    Comment libérer proprement les ressources ?



    a++

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 27
    Par défaut
    Je viens de tester en créant la liste directement dans la méthode getAll() et ça marche très bien

    Merci beaucoup pour l'aide apportée.

    Merci adiGuba, je vais regarder de plus près, je suis assez nouveau en java (moins d'un an d'éxpérience) et c'est la première VRAIE application que je réalise avec une base de données SQL ... Je vais regarder attentivement ton lien

    Coder c'est bien, Coder proprement, c'est mieux

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

Discussions similaires

  1. problème de fermeture de fenetre
    Par cedouche dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 25/01/2008, 13h00
  2. problème fermeture fenetres téléchargements
    Par djee74 dans le forum Windows Vista
    Réponses: 4
    Dernier message: 30/05/2007, 09h23
  3. [JSP] fermeture de fenetre
    Par JackNanPie dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 05/01/2005, 11h38
  4. fermeture de fenetre
    Par JackNanPie dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/01/2005, 14h34
  5. [debutant] Fermeture de fenetre
    Par wkd dans le forum Agents de placement/Fenêtres
    Réponses: 26
    Dernier message: 04/06/2004, 17h01

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