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 :

[JTable] Changer les données


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut [JTable] Changer les données
    Bonjour,

    Voilà je ne suis pas encore très à l'aise avec les JTable et là je suis face à un problème mystère (pour moi en tout cas).
    Ma classe est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private JTableModel myModel;
        public JTable table;
        private int selectedRowCourant = -1;
        private Object[][] data={{"toto", "tata" , "null"},};
     
    public TableObjetAbstrait() {
            myModel = new JTableModel();
            TableSorter sorter   = new TableSorter(myModel); 
            table = new JTable(sorter);            
            sorter.addMouseListenerToHeaderInTable(table); 
    }
    La classe JTable Model est celle ci :
    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
    class JTableModel extends AbstractTableModel{
     
            final String[] columnNames = {"Nom", "Observation" };//, "oid"};
     
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
     
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
     
            public boolean isCellEditable(int row, int col) {
                return false;
            }
     
      }//fin JTableModel
    Au départ j'ai bien "toto" et "tata" qui s'affiche dans mon tableau.
    A un moment donné de mon prog j'appelle une méthode changedata(Objet[][]) qui est donc censée changer ces données mais rien ne se passe!!
    Le code de la fonction est tout simplement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void changedata(){
            Object[][] datatmp = {{"titi", "toto" , "null"},};
            this.data=datatmp;
            myModel.fireTableRowsInserted(  data.length-1, data.length-1 );
        }
    Et pas de "titi" "toto" dans mon tableau...
    J'ai vérifié mon prog rentre bien dans la fonction et des print de data[0][0] et data[0][1] affiche bien titi et toto!...

    Une idée? Merci!!

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Points : 140
    Points
    140
    Par défaut
    C'est peut-être juste un problème de rafraîchissement du tableau. Essaye de le "reconstruire" avec un myTable.revalidate();.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    J'ai essayé le .revalidate() mais ça ne fonctionne pas...
    Ca doit vraiment etre un truc bête car j'ai un autre tableau qui ressemble bcp et ça fonctionne très bien ...

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,
    T'as essaye d'appeler la methode fireTableDataChanged() de ton model ?
    sylvain_2020

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Oui...j'ai essayé... Mais rien de mieux...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Une question qui va peut-être m'éclairer sur comment marche les JTable...

    Donc qd je fais un print de data[0][0] dans ma fonction changedata() c'est bien "titi" qui s'affiche...

    Je voudrais savoir si après ma nouvelle affectation à data mon prog est il censé passer par la méthode setValueAt()? J'imagine que oui pour que mes modifs soient prises en compte... Or là quand je fais un print "coucou" je ne le vois pas!! Mon problème viendrait il de là???

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    une précision encore :
    j'ai fait un main :
    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
     public static void main(String[] args) {
            TableObjetAbstrait  panel = new TableObjetAbstrait();
            JFrame          frame = new JFrame("TableObjetAbstrait");
            panel.changedata();
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
     
            frame.getContentPane().add(panel.getJScrollPane(), BorderLayout.CENTER);
     
            frame.pack();
            frame.setVisible(true);
        }
    Et ça ça fonctionne normalement en affichant titi et toto...

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2003
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 174
    Points : 194
    Points
    194
    Par défaut
    Salut,
    Citation Envoyé par norkius
    Une question qui va peut-être m'éclairer sur comment marche les JTable...

    Donc qd je fais un print de data[0][0] dans ma fonction changedata() c'est bien "titi" qui s'affiche...

    Je voudrais savoir si après ma nouvelle affectation à data mon prog est il censé passer par la méthode setValueAt()? J'imagine que oui pour que mes modifs soient prises en compte... Or là quand je fais un print "coucou" je ne le vois pas!! Mon problème viendrait il de là???
    A priori, non car setValueAt est appele apres l'edition de la table ... ce qui n'est pas le cas. Je pense plutot que c'est dans getValueAt() que tu devrais faire un print "coucou".

    Ce serait plus simple que tu nous postes tout ton code (les classes entieres) parce que la c'est un peu fastidieux d'aller chercher les bouts de code a droite a gauche pour comprendre ce que tu as fait ...

    sylvain_2020

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Voilà :
    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
    public class TableObjetAbstrait {
        private JTableModel myModel;
        public JTable table;
        public JScrollPane scrollPane;
        private int selectedRowCourant = -1;
        private Object[][] data={{"toto", "tata" , "null"},};
     
    public TableObjetAbstrait() {
            myModel = new JTableModel();
            TableSorter sorter   = new TableSorter(myModel); 
            table = new JTable(sorter);            
            sorter.addMouseListenerToHeaderInTable(table);         
            table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
            table.setBackground( Constantes.PANEACTIVE );
            table.setSelectionBackground( Constantes.SELECTIONACTIVE );
            table.setPreferredScrollableViewportSize(new Dimension(300,  90));
            table.addMouseListener( myMouseListener );
     
            //Create the scroll pane and add the table to it.
            scrollPane = new JScrollPane(table);
            scrollPane.setOpaque(true);        
     
            JViewport j = scrollPane.getViewport();
            j.setBackground( Constantes.PANEACTIVE );
     
            //Add the scroll pane to this window.
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            table.setRowSelectionAllowed(true);
     
        }
     
    public void changedata(){
            System.out.println("Change données de la table...");
            Object[][] datatmp = {{"titi", "toto" , "null"},};
            data=datatmp;
            System.out.println(data[0][0]); //celui ci affiche titi
            //myModel.fireTableRowsInserted(  data.length-1, data.length-1 );
            //myModel.fireTableDataChanged() ;
        }
     
      class JTableModel extends AbstractTableModel{
            static final long serialVersionUID = 1510L;
     
            final String[] columnNames = {"Nom", "Observation" };//, "oid"};
     
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data.length;
            }
     
            public Object getValueAt(int row, int col) {
                System.out.println("getValueAt = " +data[row][col]);
                return data[row][col];
            }
     
      }//fin JTableModel
     
     
    //ce main fonctionne correctement....
    public static void main(String[] args) {
            TableObjetAbstrait  panel = new TableObjetAbstrait();
            JFrame          frame = new JFrame("TableObjetAbstrait");
            panel.changedata();
            frame.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
     
            frame.getContentPane().add(panel.getJScrollPane(), BorderLayout.CENTER);
     
            frame.pack();
            frame.setVisible(true);
        }
     
    }
    Voilà comme je le disais plus haut le main test que j'ai fait fonctionne... Par contre dans mon appli entière ça ne marche pas...
    Le print dans la méthode getValueAt() affiche les mauvaises données alors que celui dans changedata() affiche les bonnes données...
    C'est pour cette raison que je pense vraiment que mon prog doit aller se ballader ailleurs après mon changedata() et réinitialiser mon tableau sans que je m'en rende compte...
    J'ai essayé le debugger de Netbeans mais j'arrive pas bien à m'en servir

  10. #10
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Le fait que tu mettes ta JTable dans un objet Scrollpane induit, je pense, qu'il faut que tu rafraichisse l'affichage de la JTable une fois tes donées changée par un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scrollPane.repaint();
    Moi j'ai la même structure (JTable dans un ScrollPane) et en faisant ça, ça marche très bien.


    Vu que la methode "getValueAt()" retourne les données contenues dans ta JTable (affichée ?) je pense que c'est pour ça qu'il te rend les anciennes données.
    L'interêt du doute est que cela fait avancer.
    (parenthèses)Je suis à la recherche d'un emploi sur Valence(26) et ses environs.
    mon cv:
    http://charegis.netcv.org/

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    je suis toujours au désespoir avec ce bug...
    J'aurai une dernière question à vous poser et après j'arrête de vous embeter avec ce truc incompréhensible...
    Que fait java une fois que les données sont changées et que le fireTableDataChanged() et appelé? Apparemment a force de mettre des print partout je vois qu'il se ballade dans getRowCount puis dans getValueAt. Y'a t-il d'autres méthodes de AbstractTableModel susceptibles de changer mes données dans lesquels mon prog va après que j'ai affecté des nouvelles données à data?

    Actuellement dans l'état de désespoir ou je suis je suis obligée de faire mon affectation de data dans la méthode getValueAt. C'est tout crade mais là je craque!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    et le scrollPane.repaint() ne change rien...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    bon après plusieurs semaines d'arrachage de cheveux j'ai trouvé le problème. Comme je le craignais ça venait d'ailleurs dans le programme et vous ne pouviez donc rien faire pour moi avec le code que je vous avais donné... donc Mea Culpa!!!
    J'ai changé un peu mon algo(je passe en fait par une étape de moins pour appeler mon changeData() et ça marche... Ne me demandez pas pourquoi j'en sais rien et je ne veux pas le savoir tellement je suis dégoutée d'avoir perdu tant de temps sur une pareille!

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

Discussions similaires

  1. [JTable] Changer les données
    Par asoka13 dans le forum Composants
    Réponses: 2
    Dernier message: 22/07/2008, 18h46
  2. [jTable] changer les couleurs sur un double clique
    Par lkryss dans le forum Composants
    Réponses: 37
    Dernier message: 04/05/2008, 22h49
  3. Changer les données affichées
    Par brohub dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/07/2006, 13h32
  4. [JTable] modifier les données à postériori
    Par SheikYerbouti dans le forum Composants
    Réponses: 4
    Dernier message: 09/02/2006, 12h19
  5. [JTable] Changer les colonnes de manière dynamique
    Par gg2laba dans le forum Composants
    Réponses: 3
    Dernier message: 03/10/2005, 23h39

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