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 et Model] Pas d'affichage de données


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut [JTable et Model] Pas d'affichage de données
    Bonjour,

    Je viens de suivre un petit exemple pour creer un model de données.

    http://www.developpez.org/club/bkost...ing/table.html

    A la différence que je charge mes données depuis un resultset.
    Lorsque je lance l'affichage les colonnes s'affichent bien mais pas les données.

    Je vous montre le code :

    le controleur avec le chargement des vecteurs qui renvoi un model de type DataFileTableModel

    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
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
     
    import java.util.Vector;
     
    import javax.swing.JOptionPane;
     
    import utilitaires.DataFileTableModel;
     
    import com.mysql.jdbc.ResultSet;
     
    import da.ClientsDA;
    import dto.Client;
    import ecrans.EcranClients;
     
    public class CtrlClients {
     
    	public CtrlClients() {
    		super();
    	}
     
     
    	/**
             * Recuperation de la liste globale des clients
             * @return jTable
             */
    	public DataFileTableModel modelClientsGlobale(){
     
    		DataFileTableModel model = null;
    		ResultSet rs = null;
     
    		// recuperation du resultset construit dans clientDA 
    		rs = (ResultSet) new ClientsDA().listeClients();
     
    		// Declaration du ResultSetMetaData
    		ResultSetMetaData md = null;
     
    		try {
     
    			// Construction du ResultSetMetaData
    			md = (ResultSetMetaData) rs.getMetaData();
    			// Récuperation du nombre de colonnes
    			int col = md.getColumnCount();
     
    			// Instanciation des deux Vectors
    	        Vector nomColonnes = new Vector();
    	        Vector donnees = new Vector();                       
     
    	        // Remplissage du Vector des nom de colonnes
    	        for (int i = 1; i <= col; i++) {
    	        	nomColonnes.addElement(md.getColumnName(i));
    	        }
     
    	        // Remplissage du vector des Données
    	        while (rs.next()) {
    	        	Vector row = new Vector();
    	             for (int i = 1; i <= col; i++){
    	            	 row.addElement(rs.getObject(i));            	 
    	             }
    	             donnees.addElement(row);
    	        }
     
    	        model = new DataFileTableModel(donnees,nomColonnes);
     
    	        //jTable.createDefaultColumnsFromModel();
     
    	        // Construction de la Jtable
    	        //jTable = new JTable(data,nomColonnes);
     
    		} catch (SQLException e) {
    			System.out.println("Erreur SQL : " + e);
    		} catch (Exception e){
    			System.out.println("Erreur : " + e);
    		}
     
    		// On retourne la jTable
    		return model;
    	}

    La classe tableModel


    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
    86
    87
    import javax.swing.*;
    import javax.swing.table.*;
    import java.io.*;
    import java.util.*;
     
    public class DataFileTableModel extends AbstractTableModel {
     
    	 protected Vector donnees;            //données
    	 protected Vector nomColonnes ;    //noms de colonnes
    	 protected String datafile;        //nom du fichier de données
     
    	 /**
              * Un Constructeur
              * 
              */
    	 public DataFileTableModel() {
    	    }
     
    	 /**
              * Un Constructeur
              * 
              */
    	 public DataFileTableModel(Vector data, Vector columnNames) {
    		 donnees = data;
    		 nomColonnes = columnNames;
    	    }
     
     
        /**
         * Nombre de colonnes
         * 
         */
        public int getColumnCount() {
            return nomColonnes.size();
           }
     
        /**
         * Nombre de lignes
         * 
         */
        public int getRowCount() {
            return donnees.size()/getColumnCount();
           }
     
        /**
         * Noms des colonnes
         * 
         */
        public String getColumnName(int columnIndex) {
            String colName="";
            if (columnIndex<=getColumnCount())
             colName=(String)nomColonnes.elementAt(columnIndex);
            return colName;
           }
     
        /**
         * Types de contenu d'une colonne
         * 
         */
        public Class getColumnClass(int columnIndex){
            return String.class;
           }
     
        /**
         * Possibilite d'édition des données
         * 
         */
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
           }
     
        /**
         * Contenu d'une cellule 
         * 
         */
        public Object getValueAt(int rowIndex, int columnIndex) {
            return (String)donnees.elementAt(
                     (rowIndex*getColumnCount())+columnIndex);
           }
     
        /**
         * Changement du contenue d'une cellule
         * 
         */
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }
    }


    Et la methode appelée pour l'affichage de la Jtable


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private JTable getJTableClients() {
    		if (jTableClients == null) {
    			DataFileTableModel model = new CtrlClients().modelClientsGlobale();
    			jTableClients = new JTable();
    			jTableClients.setModel(model);
    		}
    		return jTableClients;
    	}
    En debug les vectors se remplissent bien cependant les données ne s'affichent pas, je n'ai que les colonnes ...

    Merci a tous

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    Salut,
    as tu vérifié que tu passais bien dans la méthode getValueAt de ton model ?
    si oui vérifie ce qu'elle renvoi, sinon c'est bizarre;..

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Effectivement ca ne passe pas dedans, mais pour les colonnes non plus, il ne se sert pas de ces methodes et pourtant elles s'affichent... je vais continuer a fouiller d'autres docs car c'est pas encore acquis cette histoire de table model

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Essaye un jTableClient.repaint() ou jtableCLient.revalidate().

    Ce que tu as fais m'a l'air bon a première vue.

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Peux-tu nous montrer où tu appelles ta méthode getJTableClients(), s'il te plaît ?
    A tout hasard, aurais-tu modifier le renderer de ta JTable ?

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Voila l'appel
    Tiens d'ailleurs je connais pas ce setViewportView ca c'est generer auto avec eclipse ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private JScrollPane getJScrollPaneClients() {
    		if (jScrollPaneClients == null) {
    			jScrollPaneClients = new JScrollPane();
    			jScrollPaneClients.setBounds(new java.awt.Rectangle(20,40,600,250));
    			jScrollPaneClients.setViewportView(getJTableClients());
    		}
    		return jScrollPaneClients;
    	}

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ouais, moi en général je fais du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jScrollPaneClients = new JScrollPane(getJTableClients());
    Mais ça revient au même...

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Le revalidate ou le repaint() ne fais rien ... snif
    Je vais allez fouiller chez sun voir ce qu'ils disent ...

  9. #9
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu stockes tes données dans des Vector de Vector... mais tu récupères les données comme s'il s'agissait d'un simple Vector (tu n'accèdes jamais au second Vector) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int getRowCount() {
            return donnees.size()/getColumnCount(); // Pourquoi diviser par le nombre de colonne ????
           }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public Object getValueAt(int rowIndex, int columnIndex) {
            return (String)donnees.elementAt(
                     (rowIndex*getColumnCount())+columnIndex);
             // Pourquoi calculer la position de la sorte :
             // cela ne correspond pas au code de chargement
           }
    Cela devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int getRowCount() {
            return donnees.size();
           }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public Object getValueAt(int rowIndex, int columnIndex) {
            Vector row = (Vector)donnees.get(rowIndex);
            return row.get(columnIndex);
           }


    Et plus globalement : pourquoi ne pas utiliser directement un DefaultTableModel ? L'utilisation que tu en fait correspond complètement à cette classe...

    a++

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Par défaut
    As tu vérifier que le nombre de lignes et de colonnes renvoyé par getColumnCount() et getRowCount() est bon ?
    mais tu as dis que ton tableau s'affiche ? avec des cases vides ? ou il n'y a aucune case mis à part le header

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    269
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 269
    Par défaut
    Ah je pense que tu tiens la bonne reponse je vais tester mais effectivement en debug je vois un vector de vectors .
    Pour la table model en faity je me suis servi d'un exemple, j'aimerais beneficier du plus de possibilite possible sur ma Jtable (edition, coloration etc ...)

    Pour Lilou seul le header apparait pas du tt de cases

    -----------------------

    Pour adiGuba c'est nickel je viens de tester avec ta modif et c'est ok

    Merci a tous

    Reste plus qua reactualiser la Jtable en live al'ajout d'une donnée mais je pense qu'il ya une methode qui fait ca genre fireproperties....

    encore merci

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

Discussions similaires

  1. ORA-1652 : pas d'affichage des données ?
    Par rimas2009 dans le forum Sql Developer
    Réponses: 1
    Dernier message: 22/06/2010, 17h18
  2. Pas d'affichage des données d'un formulaire
    Par Fresal dans le forum IHM
    Réponses: 4
    Dernier message: 17/06/2008, 21h53
  3. [JTable] pas d'affichage du header
    Par I o dans le forum Composants
    Réponses: 2
    Dernier message: 27/04/2005, 13h42
  4. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07

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