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 :

[Débutant][JTable] Comment ça marche?


Sujet :

Composants Java

  1. #1
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut [Débutant][JTable] Comment ça marche?
    Bonjour

    Je voudrais savoir comment marche une JTable. J'ai déjà lu tous les liens que vous donnez habituellement et j'ai aussi fait une recherche sur le forum et lu tous les posts. Mais...

    Je ne comprend pas du tout comment ça marche. J'ai compris qu'il fallait un modèle avec quelques méthodes pour gérer la table. Mais je n'arrive pas à ajouter une ligne...

    Voici mon 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
    class MyModel extends javax.swing.table.AbstractTableModel {
            private String[] columnNames = {"Nickname",
                                            "Password",
                                            "URL",
                                            };
            private Object[][] data ;
     
     
     
     
            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 void setValueAt(Object value, int row, int col) {
                data[row][col] = value;
                fireTableCellUpdated(row, col);      // actualiser la table
     
            }
    }
    Le problème, c'est que je ne connais pas le nombre d'enregistrement à afficher, ça dépend d'une recherche dans le fichier.
    Et par conséquent, si je fais un truc dans le genre, pour ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.setValueAt("Boyz",0,0);
    ca me lance une exception ArrayBound... donc que j'ai accédé à un endroit du tableau où il faut pas. Et en effet, ne connaissant pas le nombre d'enregistrement, j'ai déclaré mon tableau data vide.
    Par contre, si je le déclare avec un enregistrement, ça modifie bien les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Object[][] data = { "Nasky", "mot2passe", "Dvp" } ;
    j'ai bien une modification de "Nasky" en "Boyz"...

    Alors ma question : comment faire pour ajouter une ligne sans connaitre le nombre à afficher.

    Et enfin, en faisant une recherche sur le forum, j'ai vu des codes n'implémentant pas la méthode setValueAt et qui pourtant semblent pouvoir ajouter une ligne.
    C'est un peu confus pour moi ....

    Par contre, je répète que j'ai bien lu les tutorials sur Internet mais que je ne les ai pas compris. Ils ne sont pas très clairs.
    Quand j'aurais compris comment fonctionne la JTable, je ferai moi-même un tutorial pour expliquer correctement le fonctionnement...

    Merci

    Nas'

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Bonjour,

    Tu peux implémenter un model comme tu le souhaites, l'essentiel est d'avoir les bonnes méthodes afin que la JTable puisse les appeller et obtenir les objets qu'elle souhaite.

    Dans le constructeur de ton model, tu peux passer un tableau d'elements, et créer ton model à partir de celui-ci, soit en le copiant, soit en le transformant.

    Tu peux très bien implémenter un model, en utilisante un ArrayList : ce qui te permettrait de rajouter des lignes sans problème de taille de tableau figée.

    L'utilisation d'un tableau, me parrait necessaire lorsque les données sortent d'une base de donnée en nombre connu et non modifiable.

    K
    K

  3. #3
    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
    Il faut reconstruire ta JTable avec les nouvelles données:

    tu fais un parcours de tes données (Vector, ArrayList, etc..) dans une boucle For et tu reconstruis.

    un exemple (à analyser toi-même) de ce que je fais dans une de mes appli (variable tableau = JTable):
    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
     
    /**       creation de la JTable contenant les données pour les entreprises par code postal
            ==============================================================================*/
    	public void creationDonneesEntrepriseCode(String[] colonne,Vector donnees) 
    	{
    		//Construction de la JTable
     
    		Object[][] tab2D = new Object[donnees.size()][100];
    		Entreprise temp;
     
    		for (int i = 0; i < donnees.size(); i++) {
    			temp = (Entreprise) donnees.elementAt(i);
     
    			String[] tab = new String[12];
    			tab[0] = temp.codePostal;
    			tab[1] = temp.nom;
    			tab[2] = temp.adresse;
    			tab[3] = temp.numeroDeTel;
    			tab[4] = temp.personneAcontacter;
    			tab[5] = "du " + temp.dateDebut + " au " + temp.dateFin;
    			tab[6] = temp.natureStatut;
    			tab[7] = temp.referenceMachine + " N° " + temp.numeroSerieMachine;
    			tab[8] = temp.numeroChrono;
    			tab[9] = temp.info;
    			tab[10] = temp.getCommercial();
    			tab[11] = temp.getTechnicien();
     
    			tab2D[i] = tab;
    			//System.out.println("tableau = "+tab);
    			//System.out.println("machine = "+temp.reference);
    		}
     
    		tableau = new JTable(new MyModel(tab2D, colonne));
    		//construction d'une JTable avec les données
    scroll.getViewport().add(tableau);
    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/

  4. #4
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Régis : ce n'est pas trop gourmant en ressource d'instancier une nouvelle table à chaque changement de valeurs ??

    Sinon, j'ai utilisé un objet Vector au lieu d'Object. Voila mon modèle maintenant :
    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
    class MyTableModel extends javax.swing.table.AbstractTableModel {
            private String[] columnNames = {"Nickname",
                                            "Password",
                                            "URL",
                                            };
            private Vector[] data ;
     
            public MyTableModel(){
                data = new Vector[getColumnCount()];
                for(int i=0 ; i< getColumnCount() ; i++)
                 data[i] = new Vector();
            }
     
     
     
     
            public int getColumnCount() {
                return columnNames.length;
            }
     
            public int getRowCount() {
                return data[0].size();
            }
     
            public String getColumnName(int col) {
                return columnNames[col];
            }
     
            public Object getValueAt(int row, int col) {
                return data[col].get(row);
            }
     
            /*
             Permet de modifier les entrees de la jtable
             */
            public void setValueAt(Object value, int row, int col) {
     
                data[col].set(row,value) ;
                fireTableDataChanged();
            }
    }
    Ca compile bien. Mais lors de l'ajout, j'ai une longue erreur et je ne peux voir le début du message tellement que c'est long (je n'ai pas de barre de défilement sous ms-dos).
    Voila comment j'ajoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.setValueAt("nasky",0,0);
    Un problème :
    Merci

    Nas'

  5. #5
    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
    Citation Envoyé par Nasky
    Régis : ce n'est pas trop gourmant en ressource d'instancier une nouvelle table à chaque changement de valeurs ??
    Vu que ta réference ne change pas, mais qu'elle pointe vers un nouvel objet, l'"ancienne" JTable n'est plus réferencée et est donc rammassée par le garbage Collector lors de son prochain passage.

    Je n'utilise pas la methode setValueAt()...sorry.
    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/

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    La méthode set() de Vector modifie un élément du vecteur mais il faut que ce dernier soit déjà présent. Ce qui ne semble pas être ton cas...

    Pour info, la méthode setValueAt() est utilisé par la JTable lors de l'édition d'une colonne éditable pour modifier la valeur qu'une colonne existante. Si tu n'a pas surchargé la méthode isCellEditable() (qui retourne toujours false par défaut) alors cette méthode est inutile !!!

    Pour rajouter une ligne, tu peux très bien ajouter une nouvelle méthode qui ajoutera un éléments dans tes Vector (sans oublier d'utiliser une méthode fireXXX() pour signaler la modification à la JTable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void addRow (String nickname, String password, String url) {
    	data[0].add(nickname);
    	data[1].add(password);
    	data[2].add(url);
     
    	fireTableRowsInserted(data[0].size(), data[0].size());
    }
    Quelques conseils :

    1. Utilise une ArrayList à la place de ton Vector et utilise l'interface List (voir Quelles différences entre ArrayList, LinkedList et Vector ? et Comment bien utiliser les collections ?)

    2. Lorsque tu modifies les données de ton modèle, il faut que tu utilises les méthodes fireXXX() d'AbstractTableModel afin de signaler la modification à la JTable pour mettre à jours l'affichage...

    3. Tu peux utiliser un objet qui englobera les informations d'une ligne. Cela te permet d'utiliser une seule liste. Il te suffit ensuite de faire un petit switch dans le getValueAt() et setValueAt() (si tu l'utilise) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public Object getValueAt(int row, int col) {
    	MonObject objet = (MonObject) maListe.get(row);
    	Object res = null;
    	switch (col) {
    		case 0: res = objet.getNickName();
    		case 1: res = objet.getPassword();
    		case 2: res = objet.getURL();
    	}
    	return res;
    }
    a++ et bon courage

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Salut,

    As-tu pensé à utiliser la méthode addRow() au lieu de setValue() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.addRow("Boyz",0,0);
    Cela permet d'ajouter une ligne de données à ton model.

  8. #8
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Je ne connaissais pas addRow() (bien que je l'ai vue dans mes recherches).
    Ca marche parfaitement maintenant.
    Je vais regarder les ArrayList (que je ne connais pas encore). Pour l'instant, avec les Vector, ça marche. Et c'est une erreur d'étourderie à propos du set() à la place du add()
    Je vais donc utiliser addRow() plutot que setValueAt()

    Regis > ah ok. Si j'avais su plus tot... ça m'aurait évité pas mal de prise de tête

    Merci pour ton explication très claire adiGuba. Je comprend mieux maintenant l'utilité de la méthode setValueAt()
    Et merci à tous aussi, hein

    Nas'

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

Discussions similaires

  1. [Débutant]Finally, comment ça marche ?
    Par PaulHuxe dans le forum C#
    Réponses: 7
    Dernier message: 26/05/2011, 15h11
  2. débutant - appli java et bdd comment ça marche
    Par 123quatre dans le forum Général Java
    Réponses: 6
    Dernier message: 25/09/2008, 21h24
  3. [JScrollPane + JTable] Comment ça marche ?
    Par Claythest dans le forum Composants
    Réponses: 6
    Dernier message: 28/02/2007, 13h01
  4. Réponses: 10
    Dernier message: 16/02/2007, 14h51
  5. [Débutant][JList] Comment ça marche dans mon cas ?
    Par gcore dans le forum Composants
    Réponses: 31
    Dernier message: 28/06/2004, 10h45

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