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 :

ajout de colonne JTable


Sujet :

Composants Java

  1. #1
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut ajout de colonne JTable
    je lance un ultime appel...
    j'ai un probleme avec les JTables qui est tout simple en fait...
    j'aimerais juste faire un ajout de colonne sur un tableau deja existant.
    le model du tableau est extend AbstractTableModel et dans cette classe je defini les fonctions classiques (getColumnName,getRowCount, getColumnCount,.....)
    je n'arrive pas a faire ce simple ajout.
    si par bidouillage j'arrive a rajouter une colonne , celle ci ne repond pas a mes demandes, et si elle y repond, elle s'ecrit par dessus une autre colonne me faisant ainsi perdre ses données...
    si qq'un pouvais m'aider ou me donner un exemple ca serait cool car je commence a perdre pied!!
    merci d'avance

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Fais en sorte que ton model hérite de DefaultTableModel et tu auras la possibilité d'ajouter une colonne grâce à la méthode addColumn(...) de ton model

  3. #3
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    merci pour ton aide...
    il me semblait bien que je devais faire un truc comme ca...cependant , je n'y arrive pas...si tu avais un exemple...un ptit bout de code peut etre qui pourrait m'aider ca serait cool...
    merci d'avance

  4. #4
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    je pensais egalement a une autre solution car je n'arrivais pas a faire ce que tu me propose:
    c'etait de travailler non pas avec des Object[][] data et String[] columnName
    mais plutot avec des vecto[][] data et String[] columnName car je peux leur rajouter des elements choses que je ne peux pas faire avec les premiers...
    qu'en penses tu?
    de mon cote je prefererai appliquer ta solution...

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bon pour faire simple: les vector ne changeront rien dans le cas présent.

    Voilà un exemple de ce que tu dois utiliser (remplace le DefaultTableModel par un model en héritant ou tu n'auras pas redéfini les diverses surcharges de la méthode addColumn):

    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
     
     
    public class TestTable extends JFrame {
     
        public TestTable() {
            super("TestTable");
            final DefaultTableModel model = new DefaultTableModel();
            JTable table= new JTable(model);
            JScrollPane scroll = new JScrollPane(table);
            JButton button = new JButton("ajout");
            button.addActionListener(new ActionListener() {
     
                public void actionPerformed(ActionEvent arg0) {
                    // TODO Auto-generated method stub
                    String nomTable = JOptionPane.showInputDialog(null,"entrer le nom de la colonne");
                    model.addColumn(nomTable);
                }
     
            });
            this.add(scroll);
            this.add(button,BorderLayout.SOUTH);
            this.pack();
            this.setLocationRelativeTo(this.getParent());
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.setVisible(true);
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            try {
                SwingUtilities.invokeAndWait(new Runnable(){
     
                    public void run() {
                        TestTable t = new TestTable();
     
                    }
     
                });
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
    }

  6. #6
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    je suis desole mais je ne comprends pas...
    g un model qui extends AbstractTableModel.
    mais il faudrait qu'en fait, pour ce meme model au lieu d'ecrire
    class MonModel extends AbstractTableModel
    {}

    j'ecrive a la place
    classe MonModel extends DefaultTableModel
    {}
    ???????

    si je fais ca j'ai une erreur qui apparait...
    je ne vois pas comment je peux faire pour passer de l'un a l'autre....

    Je suis desole si je te semble lourd!! mais ca fait un moment que je suis dessus et je tourne en rond...

    merci d'avance pour ta reponse
    mat

  7. #7
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ba il faut peut être penser à mettre à jour les imports nécessaires, sinon y'a rien à faire

  8. #8
    Membre éclairé Avatar de biozaxx
    Profil pro
    Inscrit en
    Août 2004
    Messages
    403
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 403
    Par défaut
    si je fais ca j'ai une erreur qui apparait...
    envoie le message d'erreur que tu as ...

  9. #9
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    j'ai un nullPointerException sur la fonction getRowCount() de mon model

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Fais voire le code de ton model, autrement on ne pourra t'aider

  11. #11
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    le voici: ( dans la classe JTableFixedColumn extends JScrollPane )

    protected class FixedTableModel extends AbstractTableModel
    {
    private JTableFixedColumn tableFixedColonne;

    public FixedTableModel (JTableFixedColumn tableFixedColonne)
    {
    super ();
    this.tableFixedColonne = tableFixedColonne;
    }

    public int getColumnCount ()
    {
    return ( this.tableFixedColonne.nbColonneFixe );
    }

    public int getRowCount()
    {
    return (this.tableFixedColonne.data.length );
    }

    public String getColumnName (int col)
    {
    return ( (String) this.tableFixedColonne.columnNames[col] );
    }

    public Object getValueAt (int row, int col)
    {
    return ( this.tableFixedColonne.data[row][col] );
    }

    public boolean isCellEditable (int row, int column)
    {
    return emptyTab;
    }
    c'est un model assez banal en soit...
    la fonction d'ajout de colonne :

    public void addColumn(TableColumn aColumn,String a)
    {
    NewNameCol=a;
    TableColumnModel newTCM=table.getColumnModel();
    newTCM.addColumn(aColumn);

    }

    cette fonction est appelee depuis une autre classe ainsi:

    public void AjoutColonne()
    {

    ChoixVarObs CVO2 = new ChoixVarObs(this,NomVar,true);
    String[] NomVarChoisies2=CVO2.getNomVarChoisies();
    NomVar2=NomVarChoisies2[0];

    TableColumn c= new TableColumn();
    c.setHeaderValue(NomVar2);
    ScrollTable.addColumn(c, NomVar2);
    }

    la variable ScrollTable etant une variable de type JTableFixedColumn



  12. #12
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    bonjour,
    le Wend est passe et je vous relance pour savoir si vous pouvez m'aider....
    merci d'avance
    mat

  13. #13
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    On va dire que tu a fait un bon paquet de nouilles

    En l'occurence, le model n'a absolument pas besoin de connaitre la JTable (c'est plutôt le contraire).
    Le model est destiné à contenir les données qui seront affichées dans ta table.

    Donc il faut que tu définisse les structures de données mises en jeu (les informations concernant les noms de colonnes, les données, les informations décrivant si la colonne est fixe ou pas)

    Donc grosso modo
    Une arraylist de String pour le nom des colonnes,
    Une ArrayList d'ArrayList d'Objects contenant les données
    Une ArrayList de boolean permetttant de savoir si la colonne est fixe ou pas

    Ensuite tu redéfinis le méthodes nécessaires (getColum... getValueAt... et tt le toutim)

    Sachant que vu ce que tu effectue dans ton model à l'heure actuelle tu pourrais simplment utiliser un DefaultTableModel qui possède tout ce que tu recherche

  14. #14
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    si tu me permet je vais te donner l'integralite de mon code afin que tu puisses avoir une vue d'ensemble.
    je vais te l'a filer en piece jointe.
    concernant les arrayList , je ne connais pas trop ce type d'objet, mais si ils me permettent de rajouter un element (chose que ne me permet pas les tableaux comme par exemple String[]).
    J'ai regarde le code comme je te l'avais envoye et je suis d'accord que vu comme ca ca ressemble effectivement a un beau paquet de nouille...lol
    C'est en grande partie un code que j'ai recuperé sur internet afin d'avoir des colonnes fixes pour un tableau.
    Cependant sur je j'essaye de passer d'un AbstractTableModel a un DefaultTableModel ...il n'y a plus rien qui marche...
    J'espere que tu pourras lire ce code...
    merci, en attendant ta reponse je vais etudier un peu ces arrayList
    Fichiers attachés Fichiers attachés

  15. #15
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bon je t'ai codé un Model propre à partir de ce que tu m'as file (ça marche sous java 1.5, et j'ai la flemme de faire pour la 1.4)

    Par contre colonnes fixes, que cela veut il dire pour toi? que tu ne peux éditer, qui ne peuvent bouger, qui existent mais que l'on ne voit pas?

    Car ce que tu as pour le moment c'est une table dont on ne voit pas certaines colonnes

    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
     
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Vector;
     
    import javax.swing.table.DefaultTableModel;
     
    public class MyTableModel extends DefaultTableModel {
     
        private int nbColonnesFixes;
        private List<List<Boolean>> editInformations;
     
        public MyTableModel(Object[][] arg0, Object[] arg1, int nbColonnesFixes, boolean[][] editInformations) {
            super(arg0, arg1);
            this.nbColonnesFixes = nbColonnesFixes;
            this.editInformations = new ArrayList< List<Boolean> >();
            for(int i = 0; i<editInformations.length; i++) {
                ArrayList<Boolean> tmp = new ArrayList<Boolean>();
                for(int j = 0; j<editInformations[i].length; j++ ) {
                    tmp.add(editInformations[i][j]);
                }
                this.editInformations.add(tmp);
            }
        }
     
        @Override
        public int getColumnCount() {
            // TODO Auto-generated method stub
            return super.getColumnCount() - nbColonnesFixes;
        }
     
        @Override
        public boolean isCellEditable(int arg0, int arg1) {
            // TODO Auto-generated method stub
            return editInformations.get(arg0).get(arg1);
        }
     
        @Override
        public void setValueAt(Object arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
            super.setValueAt(arg0, arg1, arg2+nbColonnesFixes);
        }
     
        @Override
        public Object getValueAt(int arg0, int arg1) {
            // TODO Auto-generated method stub
            return super.getValueAt(arg0, arg1+nbColonnesFixes);
        }
     
     
        public void addColumn(Object arg0, Object[] arg1, Boolean[] arg2 ) {
            // TODO Auto-generated method stub
            super.addColumn(arg0, arg1);
            editInformations.add(Arrays.asList(arg2));
        }
     
        @Override
        public String getColumnName(int arg0) {
            // TODO Auto-generated method stub
            return super.getColumnName(arg0+nbColonnesFixes);
        }
     
        public void setColumnName(Object arg0, int arg1) {
            // TODO Auto-generated method stub
            super.columnIdentifiers.setElementAt(arg0,arg1+nbColonnesFixes);
        }
     
    }
    Ensuite pour utiliser le model, tu regarde le constructeur et basta

  16. #16
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    merci pour ta reponse, je vais regarder tout ca...
    en ce qui concerne les colonnes fixes, ceux sont des colonnes qui ne bougent pas lorsque le scroll va sur la droite...ils appelent ca frozen column en anglais...en ce qui me concerne les 4 premieres colonnes sont fixes car elles represente la date et j'ai besoin de les voir pour n'importe quelle colonne.
    bon je vais essayer tout ca...
    Merci beaucoup

  17. #17
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ce cas là le code source que tu as choppé pour le model n'a pas grand chose à vire, il permet juste de certaines colonnes invisibles à la JTable.

    En fait pour avoir des colonnes fixes, le meilleur moyen est de mettre une deuxième JTable contenant ces colonnes dans le RowHeader de ton JScrollPane

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JTable rowTable = new JTable();
    // --- initializing
    // --- ...
    scrollPane.setRowHeaderView(rowTable);

  18. #18
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    ah bon!!!
    non pourtant ce code me permet bien de fixer (froze) les 4 premieres colonnes de ma table...
    c'est pour cela qu'il y a 2 modèles ...je t'accorde que c'est peut etre un peu tire par les cheveux mais c'est tout ce que j'ai trouve et je trouve que ca marche pas mal...lol
    dis moi ce qui te fais penser ca stp...
    j'ai une petite question :
    je n'ai jamais vu un code comme tu m'as ecris: que veux dire
    List<List<Boolean>> est-ce une maniere rapide de declarer des objets?je ne connais pas cette synthaxe...A quoi celle ci est equivalente?
    merci!
    mat

  19. #19
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    EN fait c'est du java 1.5 dans lequel tu peux déclarer les types contenus dans tes collections
    Donc List<List<Boolean> > correspond à une liste contenant des listes de Boolean

    Sinon pour ce que je t'ai indiqué il manque le header des colonnes fixes, tu peux corriger le pb en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,maTableFixe.getTableHeader());
    En même temps tu te compliquais clairement la vie, ici tu as deux modèles deux tables et pas de complications outre mesure. plus un élément est complexe plus il a tendance à bugger car on a oublié de traiter un cas particulier

  20. #20
    Membre averti Avatar de matzeus
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Par défaut
    je te remercie pour ces lumieres...
    je vais travailler la dessus et je te tiens au courant.
    merci encore

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Ajout de colonnes : JTable depuis un AbstractModel
    Par OizO_ dans le forum Composants
    Réponses: 0
    Dernier message: 25/04/2012, 18h28
  2. Réponses: 0
    Dernier message: 13/04/2012, 17h57
  3. [JTable] ajouter une colonne spéciale
    Par minooo dans le forum Composants
    Réponses: 10
    Dernier message: 16/02/2009, 17h25
  4. Jtable ajouter des colonne
    Par toure32 dans le forum Composants
    Réponses: 6
    Dernier message: 21/06/2006, 09h15
  5. [JTable] ajouter une colonne de checkbox
    Par nawel dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2005, 14h07

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