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

Composants Java Discussion :

Problème de mise a jours d'une JTable


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut Problème de mise a jours d'une JTable
    Hello,

    Je dispose d'une JTable utilisée pour représenter une table SQL dans une base de donnée. L'utilisateur à la possibilité de modifier les champs de la table SQL à afficher dans cette JTable.

    Lorsque je charge la table pour la première fois, aucun problème, tout s'affiche bien. En revanche, lorsque l'utilisateur décide de changer la liste des champs, je n'arrive pas a mettre à jours l'affichage de ma table avec les nouvelles colonnes/valeurs.

    Le modèle de la table est donné par une classe DBViewerTableModel qui hérite de AbstractTableModel. A prioris j'ai bien défini celle-ci puisque la table s'affiche très bien la première fois. Lorsque l'utilisateur modifie les champs à afficher, je recharge simplement l'ensemble des données avec les champs qui vont bien via un ResultSet. A partir de la je met a jours les données de mon modèle, puis j'appele la méthode fireTableStructureChanged sur mon modèle.

    Malheureusement comme dit précédement ca ne marche pas, rien ne se passe; en mettant un print dans les méthodes getValueAt ou getColumnName, rien ne s'affiche. J'ai essayé repaint et revalidate sur la JTable en plus de cela, mais rien n'y fait... J'affiche également la mise a jours de mon modèle via. le nom des nouvelles colonnes, et les données sont bien mises a jours... J'ai essayé de recréer un nouveau modèle à chaque changement, toujours rien... :S Il faut que je ferme ma fenetre et que je réouvre la vue pour obtenir la table avec les nouveaux champs à afficher...

    Quelqu'un aurait-il une idée? Est-ce que j'ai sauté une étape?

    Voici un bout de code représentant la méthode que j'appele lorsque je doit mettre a jours ma table (c'est également celle que j'appelle lorsque je charge la table pour la première fois):
    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
     
    public void refresh() {
        (...)
     
        ResultSet rs = database.retrieveTable(fieldsToDisplay) ;
        if(this.model == null) {
            this.model = new DBViewerTableModel(rs) ; 
            // Notez que ma table est contenue dans un JScrollPane 
            // qui est variable d'instance d'une classe qui hérite de JPanel,
            // ici représenté par la variable d'instance tablePanel
            this.tablePanel.setTableModel(this.model) ;
        }
        else this.model.setData(rs);
     
        this.model.fireTableStructureChanged() ;
        rs.close();
     
        (...)
    }

  2. #2
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 85
    Points : 355
    Points
    355
    Par défaut
    Bonjour,

    pourrais-tu fournir le code de ta classe DBViewerTableModel s'il te plait.

    En fait, je voudrais surtout le corps de la méthode setData().

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Voilà le code en simplifié.

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    public class DBViewerTableModel extends AbstractTableModel
    {
        private String[] columnNames ;
        private String [] columnClassNames ;
        private Class [] columnClasses ;
        private ArrayList<ArrayList> data ;
     
        private int nbCols ;
        private int nbRow ;
     
        public DBViewerTableModel(ResultSet rs)
                throws SQLException
        {
            determineColumnTypes(rs) ;
            extractData(rs) ;
        }
     
        private void determineColumnTypes(ResultSet rs) 
            throws SQLException 
        {
            ResultSetMetaData metadata = (ResultSetMetaData) rs.getMetaData();    // Get metadata on them
    		nbCols = metadata.getColumnCount();
     
            columnNames = new String[nbCols];
            columnClassNames = new String[nbCols];
            columnClasses = new Class[nbCols] ;
     
            // Retrieve and store column informations and classes
    	for(int i = 0 ; i < nbCols ; i++){
    	    columnNames[i] = metadata.getColumnName(i+1);
                columnClassNames[i] = metadata.getColumnClassName(i+1) ;
     
                // Determine class
                try {
                    columnClasses[i] = Class.forName(columnClassNames[i]) ;
                }
                catch (ClassNotFoundException ex) {
                    columnClasses[i] = String.class ;
                }
    	}
        }
     
        private void extractData(ResultSet rs) 
                throws SQLException
        {
    	data = new ArrayList<ArrayList>();
     
            // Loop over the result set rows (molecules...)
            nbRow = 0 ;
            while (rs.next()){
                // For each molecule create an array list that will store all
                // associated values like ID, descriptors ...
    		ArrayList row = new ArrayList(nbCols);
     
    		for(int i = 0 ; i < nbCols ; i++){
                    // Otherwise store the exact column type.
                    if(columnClasses[i].equals(Integer.class)) row.add(i, rs.getInt(i+1)) ;
                    else if(columnClasses[i].equals(Long.class)) row.add(i, rs.getLong(i+1)) ;
                    else if(columnClasses[i].equals(Float.class)) row.add(i, rs.getFloat(i+1)) ;
                    else if(columnClasses[i].equals(Double.class)) row.add(i, rs.getDouble(i+1)) ;
                    else if(columnClasses[i].equals(Boolean.class)) row.add(i, rs.getBoolean(i+1)) ;
                    else if(columnClasses[i].equals(Date.class)) row.add(i, rs.getDate(i+1)) ;
                    else row.add(i, rs.getString(i+1)) ;
    	        }
     
                  // Actually add the molecule to the full list.
    	      if (row != null) {
                       data.add(nbRow, row) ;
                       nbRow ++ ;
                  }
     
    	}
        }
     
        public void setData(ResultSet rs)
                throws SQLException 
        {
            // Retrieve and store the new molecules
            determineColumnTypes(rs) ;
            extractData(rs) ;
     
            fireTableStructureChanged();
            fireTableDataChanged();
        }
     
        public int getRowCount() {
            return this.nbRow ;
        }
     
        public int getColumnCount() {
            return this.nbCols ;
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
    		return ((ArrayList)data.get(rowIndex)).get(columnIndex);
        }
     
        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }
     
        public String[] getHeaders() {
            return columnNames;
        }
     
        @Override
        public Class getColumnClass(int column) {
            return columnClasses[column] ;
        }
    }

  4. #4
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 85
    Points : 355
    Points
    355
    Par défaut
    Euh, c'est quoi cette méthode dans le setData ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        
    public void setData(ResultSet rs)
                throws SQLException 
        {
            // Retrieve and store the new molecules
            determineColumnTypes(rs) ;
            extractCompounds(rs) ;
     
            fireTableStructureChanged();
        }

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    En ajoutant les print suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            System.out.println("Getting value at "+rowIndex+"/ "+columnIndex+" / "+nbcols);
    		return ((ArrayList)mols.get(rowIndex)).get(columnIndex);
        }
     
        @Override
        public String getColumnName(int col) {
            System.out.println("Column : "+col+"/ "+nbcols);
            return columnNames[col];
        }
    Au premier lancement, sachant que par défaut on affiche 3 champs de la table SQL, j'obtient l'affichage suivant:
    Column name: 0/ 3
    Column : 1/ 3
    Column : 2/ 3
    Getting value at 0/ 0 / 3
    Getting value at 0/ 1 / 3
    Getting value at 0/ 2 / 3
    Getting value at 1/ 0 / 3
    Getting value at 1/ 1 / 3
    Getting value at 1/ 2 / 3
    Getting value at 2/ 0 / 3
    (...)
    En ajoutant deux champs à afficher, lorsque je demande de mettre à jours la table, j'obtient uniquement:
    Column : 0/ 5
    Column : 1/ 5
    Column : 2/ 5
    Column : 3/ 5
    Column : 4/ 5
    A première vue il prend en compte le changements de colonnes, mais rien quand aux données.

    En faisant glisser le curseur du scrollPane de la table, il apparait:
    Getting value at 5/ 0 / 3
    Getting value at 5/ 1 / 3
    Getting value at 5/ 2 / 3
    Getting value at 6/ 0 / 3
    Getting value at 6/ 1 / 3
    Getting value at 6/ 2 / 3
    Getting value at 7/ 0 / 3
    Donc il ne semble finalement pas avoir le bon nombre de colonnes...Quelque chose m'échappe

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Notez aussi que je n'affiche que 100 lignes à la fois dans la table; ainsi lorsque la table en contient plus de 100, l'utilisateur navigue à travers les entrées via des boutons lui permettant d'avancer de 100 en 100.

    Et à ce niveau aucun problème, ca fonctionne, lorsqu'il avance d'une page, je récupère mes données, je les mets a jours, et il me met correctement a jours la vue...

    Le problème semble donc être lorsque, d'une vue à l'autre, les colonnes de mes données sont différentes des précédentes... Mais comprends toujours pas pourquoi

  7. #7
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 85
    Points : 355
    Points
    355
    Par défaut
    Que fait cette méthode : "extractCompounds(rs) ;" ?
    Est-ce elle qui modifie le contenu de "data" ?

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    C'est une erreur de ma part, c'est bien extractData qui est appelé de la même manière que dans le constructeur.

  9. #9
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Points : 172
    Points
    172
    Par défaut
    Du nouveaux: la table se met bien a jours lorsque j'ajoute des colonnes à partir de la table de base. En revanche, lorsque j'en retire, la table ne se met pas a jours...

  10. #10
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 85
    Points : 355
    Points
    355
    Par défaut
    Salut,

    j'avoue que tout ça me laisse perplexe. J'ai un peu lâché l'affaire, mais je si je trouve un peu de temps je me repenche sur le problème...

Discussions similaires

  1. mise a jour d'une Jtable
    Par boumacmilan dans le forum Composants
    Réponses: 1
    Dernier message: 22/06/2009, 11h35
  2. Mise à jour d'une JTable (Problème d'affichage)
    Par ouchemhou dans le forum Composants
    Réponses: 29
    Dernier message: 14/08/2008, 13h33
  3. [MySQL] Problème de mise a jour d'une donnée dans la base
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 24/05/2007, 16h06
  4. Mise à jour d'une JTable en fonction d'une JList
    Par xtaZy dans le forum Composants
    Réponses: 1
    Dernier message: 21/03/2007, 18h25
  5. mise à jour d'une JTable ?
    Par Sakalam dans le forum Composants
    Réponses: 11
    Dernier message: 15/09/2006, 15h06

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