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 :

Mettre à jour le contenu d'une JTABLE


Sujet :

Composants Java

  1. #1
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut Mettre à jour le contenu d'une JTABLE
    Bonjour,
    Dans un système de pagination, j'essaie de mettre dynamiquement à jour le contenu d'une JTable en fonction des lignes ramenées pour chaque page. Le code suivant semble insuffisant dans la mesure ou la JTable continue d'afficher les anciennes lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    model.setDataVector(data,colnames);
    table.setModel(model);
    Aurais-je oublié quelque chose ?
    D'avance merci.

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Même en ajoutant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    model.fireTableDataChanged() ;
    table.revalidate();
    il n'y a aucun changement visuel.
    Je ne pensais pas que quelque chose de si simple puisse être si compliqué.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Est-ce que si tu redimensionnes ton table (Forcer le repaint) les bonnes données apparaissent ?
    Si ça ne change rien c'est peut-être ton model qui n'est pas bon.

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Voici le modèle:
    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
     
     /*---------------------------------------
      *  TableModel class to allow updates
      *--------------------------------------*/
     class MyTableModel extends AbstractTableModel {
     
     
            private String[] columnNames = {" "};
            private Object[][] datas = {{" "," "}};
     
            public MyTableModel()
            {
              super();
            }
     
            public MyTableModel(Object[][] dataVector,Object[] columnIdentifiers)
            {
                super();
                columnNames = (String[])columnIdentifiers ;
                datas = dataVector;
            }
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                if (datas != null) return datas.length;
                else return 0;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return datas[row][col];
            }
     
            public void setDataVector(Object[][] dataVector,
                              Object[] columnIdentifiers) {
                columnNames = (String[])columnIdentifiers ;
                datas = dataVector;
            }
     
            public Class getColumnClass(int c) {
                Object o = getValueAt(0, c);
                if(o == null) {
                    if("INTEGER".equalsIgnoreCase(coltypes[c])) return Integer.class;
                    else if("DATE".equalsIgnoreCase(coltypes[c])) return Date.class;
                    else return Double.class;
                }
                return o.getClass();
            }
     
            public boolean isCellEditable(int row, int col) {
                CellProp cp = (CellProp)hCellProps.get(colnames[col]);
                if (!bUpdatable) {
                    return false;
                } else {
                    return true;
                }
            }
     
            public void setValueAt(Object value, int row, int col) {
                datas[row][col] = value;
                iRowsChanged[row] = 1 ;
                SendMessage(DrawLAF.TBTABLE_CHANGE, ""+(row+1)+","+(col+1));
            }
     
            private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();
     
                for (int i=0; i < numRows; i++) {
                    log("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        log("  " + data[i][j]);
                    }
                    log("");
                }
                log("--------------------------");
            }
     
        }

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Je pense qu'il faut que ton modèle émette des events quand tu le modifie via les méthodes fireXXXEvent :

    - setDataVector
    - setValueAt

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Merci.

    J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fireTableDataChanged();
    dans setDataVector() et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fireTableCellUpdated(row, col);
    dans setValueAt()
    mais cela ne change toujours rien

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    A chaque changement de page tu appelle setDataVector() ?
    Au redimensionnement aucun changement ?

    Fait voir comment tu modifie le modèle à chaque changement de page.

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    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
        //
        // refresh the list
        //
        boolean setTableRefresh(String page) 
        {
          int iPage = 0 ;
          log("setTableRefresh() page:("+page+")");
          try {
              iPage = Integer.parseInt(page);
              if(iPage > 0) {
                iCurPage = iPage ;           
                model.setDataVector(data,colnames);             
                model.fireTableDataChanged() ;
                //model.fireTableStructureChanged();
                //table.setModel(model);            
                table.revalidate();
              }
          }
          catch(Exception e) {e.printStackTrace();}
          return true ;
        }

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu ne m'as toujours pas répondu pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Au redimensionnement aucun changement ?
    Essaye table.repaint();

    Tu as bien ajouté le model au JTable (Via le constructeur ou setModel()) ?

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    repaint() ne résout rien, et oui le modèle est bien attaché à la table car la première page affichée à la création présente correctement les lignes.
    Merci.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Ton évènement est-il bien appelé ? (Log de "setTableRefresh() page: ("+page+")");

    A quel moment ton model change selon la page ?
    Car dans le code de changement de modèle, tu ne fais rien de iCurPage , et data et colNames ne sont pas modifiés. Si tu remets les mêmes données, normal que l'affichage ne change pas.

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    data est alimenté avant, et les données sont correctes avec des System.out.println(). c'est seulement que la JTable continue d'afficher les anciennes lignes.

  13. #13
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu devrais mettre des logs sur getValueAt dans le modèle. C'est la méthode utilisée par le JTable pour faire son affichage.

    Si après le changement de page :
    - Tu as des logs avec les ancienne valeur c'est que ton modèle n'est pas setté correctement.

    - Tu n'as pas de log : alors c'est un problème de ré affichage et les solutions proposées avant aurait du le résoudre.

    - Tu as les bonnes valeurs loggée mais pas affichées => Alors là c'est le grand mystère (Chose qui ne me semble pas compatible avec l'informatique).



    Avec le code incomplet difficile de faire mieux. Je ne vois pas d'autres possibilités (Cela ne signifie pas qu'il n'y en a pas).

  14. #14
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    effectivement, getValueAt() retourne les anciennes valeurs, alors que le tableau datas[] fourni at setDataVector() contient bien les nouvelles

  15. #15
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Montre l'ensemble du code exécuté lors du changement de page. Je suppose que c'est dans un actionPerformed ou quelque chose comme ça.

  16. #16
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    C'est dans un Java Bean:
    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
        //
        // refresh the list
        //
        boolean setTableRefresh(String page) 
        {
          int iPage = 0 ;
          log("setTableRefresh() page:("+page+")");
          try {
              iPage = Integer.parseInt(page);
              if(iPage > 0) {
                iCurPage = iPage ;           
                model.setDataVector(data,colnames);             
                model.fireTableDataChanged() ;
                table.repaint();
              }
          }
          catch(Exception e) {e.printStackTrace();}
          return true ;
        }
    c'est currieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
            public Object getValueAt(int row, int col) {
                if(col==2)err("getValueAt:"+datas[row][col]);
                return datas[row][col];
            }
     
            public void setDataVector(Object[][] dataVector,
                              Object[] columnIdentifiers) {
                columnNames = (String[])columnIdentifiers ;
                datas = dataVector;
    System.out.println("---------- nbRows:"+datas.length);
                fireTableDataChanged();
            }
    ...
    getValueAt() affiche les anciennes valeurs (10 lignes) alors que setDataVector() affiche seulement 4 lignes pour datas[]

  17. #17
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    A mon avis tu modifies un model différent de celui qui est utilisé par le JTable de l'interface. D'où l'intérêt d'avoir le reste du code !!

  18. #18
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Ok, c'est réglé. Effectivement, dans une partie du code le modèle était recréé.
    Désolé et merci encore.

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

Discussions similaires

  1. Mettre à jour un bouton dans une JTable
    Par peofofo dans le forum Composants
    Réponses: 2
    Dernier message: 06/01/2012, 21h51
  2. Mettre à jour le contenu d'une jscrollpane.
    Par Decon dans le forum Général Java
    Réponses: 1
    Dernier message: 25/05/2010, 02h58
  3. Réponses: 1
    Dernier message: 07/05/2010, 14h36
  4. Mettre à jour le contenu d'une box
    Par Rizen dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 03/01/2010, 23h19
  5. Réponses: 14
    Dernier message: 15/01/2009, 09h54

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