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]inseretion d'une collection d'objets. HELP!


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut [JTable]inseretion d'une collection d'objets. HELP!
    Bonjour tout le monde,

    Cela fait maintenant 48h que je cherche à afficher dans une JTable des objets (Ressource) issus d'une collection (List).
    Je voudrais tout simplement que les colonnes correspondent aux propriétés (ref, titre,...) et les lignes aux différents objets (ressource1, ressource2, ...).
    J'ai regardé 10 000 exemples de JTable sur les forums. Apparemment, on fait le chargement de la JTable à partir d'ArrayList ou de Vector mais c'est justement là que je bloque!!!
    Comment manipuler tout ça pour arriver à mon souhait (assez classique, je pense...) ???
    A vrai dire, je frole la crise de nerf (la nuit blanche à regarder des lignes de code doit pas être complètement étrangère à cet état...) !
    Si l'un de vous avait l'amabilité de mettre un petit exemple...
    Merci d'avance pour votre compassion. :-)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Définir ton propre model héritant d'AbstractTableModel

    réfère toi à ceci au niveau de l'exemple MyTableModel en remplaçant les tableaux par des listes.

    voir là: http://java.sun.com/docs/books/tutor...able.html#data
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    D'ores et déjà , un enorme Merci pour toi (sinok) pour la rapidité de ta réponse!!! :-)
    Je regarde attentivement le lien que tu m'as fourni et vous tiens aux news de mes avancées...

  4. #4
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    +1 ce n'est pas à l'objet JTable que tu dois t'adresser ( ce n'est que la représentation graphique des données ) mais à un TableModel qui contient les données à affiche dans ta JTable.
    Il faut que tu fasses toi-même une classe implémentant TableModel qui possèdera la méthode "add(List list)"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public MonTableModel implements TableModel{
       List datas=new ArrayList();
       // Redéfinir toutes les méthodes de TableModel
       public void add(List lst){
          this.datas.addAll(lst);
       }
    }
    Si tu ne veux pas redéfinir toutes les méthodes de TableModel, tu peux étendres les classes AbstractTableModel ou DefaultTableModel.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Bonsoir et merci pour ta réponse iohack !!!
    Lorsque je suie ton exemple, Eclipse m'indique que
    this.datas.addAll(lst);
    on ne peut pas invoquer addAll(List) dans un tableau de type ArrayList[].

    Que quoi est-ce? D'où vient-ce?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Oups!!!
    Je retire mon dernier post, j'avais du code obsolète qui traînait....

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Du coup, si je suie bien le raisonnement, j'insère effectivement les données grâce à cette méthode add(lst)!?
    Je teste ça tout de suite!!!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Alors voila où j'en suis :
    J'ai Créer une classe TableModelPerso de la sorte :

    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
     package ihm;
     
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.table.AbstractTableModel;
     
    public class TableModelPerso extends AbstractTableModel {
     
    	private static final long serialVersionUID = 1L;
    		String [] labelColonne ;
    		List data = new ArrayList();  //Les données
     
    	//constructeur
    	public TableModelPerso () {  }
     
      //Fonctions de AbstractTableModel surchargées
     
      public String  getColumnName  (int col) {
             return labelColonne[col].toString();
      }
      public int     getRowCount    () {
             return data.size();
      }
      public int     getColumnCount () {
             return labelColonne.length;
      }
      public boolean isCellEditable (int row, int col) {
             return false; 
      }
      public Object  getValueAt (int row, int col) {
             return data.get(row);// pas de sens !!!
     }
     
      //La fameuse méthode d'insertion (qui m'a empêché de dormir la nuit dernière.. ;-))
      public void add(List lst) {
    	  this.data.addAll(lst);
      }
     
     /* //On ajoute , on remplace ou on supprimer suivant les valeurs entrées...
     
    }
    Je souhaiterai maintenant creer et charger ce tableau depuis une méthode de mon formulaire principal que j'appellerai depuis ma classe IhmListener (gestionnaire d'évènements du formulaire précité).

    méthode en question du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void creerTableRessources (){
    			tblRessources = new TableauRessources();
    			panelScrolable.setViewportView(tblRessources);
    			///il ne reste plus qu'à charger les données ...
    		}
    Vous vous en doutiez, j'ai un petit souci... :-(

    Je ne voie pas comment invoquer la méthode AddAll de ma classe TableModelPerso....

    Quelqu'un visualise t il mon problème ?
    Et si oui, peut-être a-t-il même une proposition intéressante à me faire...
    Encore merci à toutes les âmes charitables!!

  9. #9
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Un truc comme ceci devrait passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    _model = new TableModelPerso();
    //Chaque fois que tu veux recharger entierement ta JTable
    _model.add(taListe);
    _taJtable = new JTable(_model);
    Si tu as a la changer entierment apres tu devras faire quelque comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    _model.add(taListe);
    _model.fireTableDataChanged();
    _taJtable .repaint();

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Merci e1lauren pour cette info.
    Si je comprend bien, tu proposes de mettre ce code dans la methode creerTableauRessource de mon formulaire?

    En tout cas, je teste tout de suite !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    A priori, cela semble passer !!!!
    En tout cas, plus de message d'erreurs. Par contre toujours pas d'affichage du tableau dans le formulaire... Je m'y attele de ce pas! :-)
    Encore merci à vous tous!

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord merci à vous tous!
    Ca fonctionne... presque! ;-)
    La JTable est désormais opérationnelle mais elle affiche les références des instances au lieu d'afficher les données.
    Cela fait quelques heures maintenant que je cherche un moyen de rémédier à cela mais pour l'instant sans succés...
    J'ai essayé de différentes façons (transtypage, changement de conteneur, ...) dans la méthode add de mon modele de Jtable ( juste avant de charger la collection )mais sans succés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void add(List lst){
    	  // transformer cette collection d'objet (lst) en String  ???
    			this.data.addAll(lst);
      }
    Dois-je récupérer chaque objet de la liste et, pour chacun, récupérer une à une les valeurs de leurs variables (à base d'iterator et de getXXX) ?
    Ou bien existe-t-il une technique permettant de le faire au niveau de la collection?

    Merci d'avance.

  13. #13
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Tu peux essayer de mettre dans ta List une ArrayList d' ArrayList de String au lieu d'une ArrayList de tes ressources. En gros converti tes ressources en ArrayList avec les valeurs à afficher ...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est normal.
    Le renderer par défault d'nue JTable s'appuie par défaut sur la méthodes toString de l'Oject présent dans ton model.

    Donc deux solutions au minimum pour contourner ça: redéfinir la méthode toString de tes Class

    ou créer un renderer adaptatif au différents objets présents dans ta JTable.

    Pour la seconde solution réfère toi à nouveau au lien que j'avais filé dans ma première réponse
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Bonjour tout le monde,

    J'ai encore un léger problème pour le chargement de ma Jtable.
    Je réussie à afficher les valeurs de mes objets dans la JTabl mais il semblerait que j'ai encore un problème de compréhension.
    En effet, alors que je souhaiterai afficher les différentes propriétés dans les colonnes et créer une ligne par objet.

    Voici la méthode dans laquelle je charge les données (string) de chaque objet dans une arrayList (res2txt) qui est elle-même, une fois remplie, ajoutée dans une autre arraylist (ressourcesTxt) :

    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
    public static List Ressources2txt(){
     
    		 ArrayList ressourcesTxt = new ArrayList();
    		 GestionDate dateFormatée = new GestionDate();
    		 List ressources = session.createQuery("select r from Ressource as r").list();
    		 for (int i = 0; i < ressources.size(); i++) {
    					ArrayList res2txt = new ArrayList();
    					Ressource element = (Ressource) ressources.get(i);
    					res2txt.add(0, element.getTitre());
    					res2txt.add(1, element.getTitreorigin());
    					res2txt.add(2, element.getDurée());
    					res2txt.add(3, dateFormatée.getDateLongue(element.getDatesortie()));
    					res2txt.add(4, element.getResume());
    					res2txt.add(5, element.getLicence());
    					res2txt.add(6, element.getSupport());
    					res2txt.add(7, element.getDoncopie().toString());
    					res2txt.add(8, dateFormatée.getDateLongue(element.getDaterecept()));
    					res2txt.add(9, dateFormatée.getDateLongue(element.getDatereponse()));
    					res2txt.add(6, element.getRef().toString());
    					ressourcesTxt.add(i, res2txt);
    				}
     
    		 return ressourcesTxt;
    	 }

    Pour ce qui est de la méthode de chargement de la JTable, elle n'a pas changée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public void add(List lst){
    	  // transformer cette collection d'objet en String
    				this.data.addAll(lst);
      }
    Ou est-ce que je me trompe?

  16. #16
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Ca a l'air correct pourtant Qu est ce qui ne va pas ?
    Sinon tu n'as pas besoin de preciser dans add() le numero de ligne puisque tu inseres séquentiellement dans l'ordre...

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Heureux de te voir e1lauren!

    En fait, toutes les infos d'un objet se trouvent dans chaque cellule de la ligne!?
    De plus, elles sont entre crochets...
    Je suppose qu'il faut faire arriver à séparer les données pour les répartir entres les colonnes.

    J'essaye de m'inspirer d'un code telle que celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      data = new ArrayList[labelColonne.length];
    	     for (int i = 0; i < labelColonne.length;i++)
    	       data[i] = new ArrayList(lst);
    Je l'ai placé au sein de ma méthode de chargement de la JTable (add(List lst) )... Pour l'instant sans succés...
    Si quelqu'un voie le problème...
    Merci

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est simple tu as mal redéfini la méthode getValueAt(int row, int col)


    Col dans ton cas toi pointer sur une des propriétés de l'objet contenu dans ta liste.

    Par exemple soit la classe suivante


    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
    public class TrucMachin {
        private int truc;
        private int machin;
        /**
         * @param truc
         * @param machin
         */
        public TrucMachin(int truc, int machin) {
            super();
            this.truc = truc;
            this.machin = machin;
        }
        /**
         * @return machin
         */
        public int getMachin() {
            return machin;
        }
        /**
         * @param machin machin à définir
         */
        public void setMachin(int machin) {
            this.machin = machin;
        }
        /**
         * @return truc
         */
        public int getTruc() {
            return truc;
        }
        /**
         * @param truc truc à définir
         */
        public void setTruc(int truc) {
            this.truc = truc;
        }
     
    }
    Dans le getValueAt tu devras procéder de la façon suivante

    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) {// pas de sens !!!
         if (o instance of TrucMachin) {
             if(col == 0) {
                return ((TrucMachin)o).getTruc();
             } else if (col ==1) {
                return ((TrucMachin)o).getMachin();
             }
         }
     }
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 43
    Points : 14
    Points
    14
    Par défaut
    Merci de ta réponse sinok! :-)
    La question est : comment récupérer au sein de ctte méthode le nombre d'instances de TrucMachin?
    Désolé...

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le getValueAt ne sert pas à ça, il permet de récupérer l'élément qui se trouvera à dans la cellule de ligne row et de colonne col.

    Pour ta question: tu boucle sur ta liste ta liste et fais un truc dans ce genre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int cpt = 0;
    for(Object o : data) {
      if( o instanceof TrucMachin ) {
         cpt++;
      }
    }
    et a la fin de la boucle cpt contient le nombres d'instances de TrucMachin contenu dans data, algo brut de décoffrage, rien de magique là dedans...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

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

Discussions similaires

  1. Modifier une collection d'objets dans un formulaire
    Par GiveMeAName dans le forum Struts 1
    Réponses: 6
    Dernier message: 30/08/2006, 13h30
  2. Réponses: 6
    Dernier message: 24/03/2006, 09h22
  3. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51
  4. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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