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 :

Afficher tableau JTable avec un modeleDeTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut Afficher tableau JTable avec un modeleDeTable
    Bonsoir à tous, je suis sur un projet en Java, j'essaie actuellement de faire des test:

    J'explique la situation :
    • J'ai une classe Client avec ses accesseurs et autre méthode.
    • Une fenêtre swing avec un JTable pour afficher les clients.
    • Une classe modeleClients liée à mon JTable.
    • La classe Main ou j'effectue des tests



    Mon problème étant que je ne parvient pas à afficher ma liste de client dans mon JTable, je vous montre mon code :

    Ma classe ModeleClients
    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
     
     
    public class ModeleClientsextends AbstractTableModel {
     
    	private final String[]entetesColumn = {"Numero client", "Type de contrat", "Nom", "Ville", "Rue", "N° rue", 
    											"Code postale", "Téléphonne", "Téléphonne bis"};
     
     
    	private ArrayList<Client>ListClient = new ArrayList<Client>();
     
    	public ArrayList<Client> getListClient() {
    		return ListClient;
    	}
     
    	public void setListClient(ArrayList<Client> listClient) {
    		ListClient = listClient;
    	}
     
        /**
         * Retourne le nombre de ligne du modele
         */
        @Override
        public int getRowCount() {
            return ListClient.size();
        }
     
    	/**
         * Retourne le nombre de colonne du modele
         */
        @Override
        public int getColumnCount() {
            return entetesColumn.length;
        }
     
        /**
         * Retourne le nom de la colonne à l'index columnIndex
         */
        @Override
        public String getColumnName(int columnIndex) {
            return entetesColumn[columnIndex];
        }
     
        /**
         * Retourne la valeur de la cellule à la valeur ligne/colonne
         */
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            switch(columnIndex) {
            case 0 :
            	return ListClient.get(rowIndex).getIdClient();
            case 1 :
            	return ListClient.get(rowIndex).getIdTypeClients();
            case 2 :
            	return ListClient.get(rowIndex).getNomClient();
            case 3 :
            	return ListClient.get(rowIndex).getVilleClient();
            case 4 :
            	return ListClient.get(rowIndex).getRueClient();
            case 5 :
            	return ListClient.get(rowIndex).getNumRueClient();
            case 6 : 
            	return ListClient.get(rowIndex).getCpClient();
            case 7 : 
            	return ListClient.get(rowIndex).getTel1Client();
            case 8 :
            	return ListClient.get(rowIndex).getTel2Client();
            default : 
            	throw new IllegalArgumentException();
            }    
        }
    }
    Ma class Main (Je ne met pas tout le code) :

    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
     
    public class MainTestBis {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    	               //Requete de type SELECT *;
     
    			ModeleClients monModele = new modeleClients ();
    			ArrayList<Client> LstClient = new ArrayList<Client>();
     
    			while(rs.next()) {			
    				LstClient.add(new Client(rs.getInt("ID_CLIENT"), rs.getInt("ID_TYPE_CLIENT"), rs.getString("NOM_CLIENT"), 
    											rs.getString("VILLE_CLIENT"), rs.getString("RUE_CLIENT"),
    											rs.getInt("NUM_RUE_CLIENT"),rs.getInt("CP_CLIENT"),rs.getInt("TEL_1_CLIENT"),
    											rs.getInt("TEL_2_CLIENT")));
    			}
     
     
    			monModele .setListClient(LstClient);
     
    			Fenetretest oFen = new Fenetretest();
     
    			rs.close();
    			stmt.close();
     
    		} catch (Exception e) {
    			e.printStackTrace();
     
    		}		
    	}
    }
    Et dans ma fenêtre je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JTable jTable = new JTable(new modeleClients());
    Je récupère bien ma liste de client j'ai fait un test avec ma méthode getListClient(), le problème étant que je n'arrive pas à l'afficher, je n'ai que les entêtes de mes colonnes.

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Lorsqu'on implémente un modèle dynamique, comme c'est le cas de ton modèle, il est nécessaire de mettre en place un système évenementiel qui va permettre à la JTable de connaitre les modifications qui sont faites dans le modèle.

    Dans ce tutoriel d'Oracle, tu trouveras les différentes méthodes qui permettent de prévenir la JTable que tu modifies quelque chose dans le modèle.

    Par exemple, pour ta méthode setListClient, il faudrait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setListClient(ArrayList<Client> listClient) {
        ListClient = listClient;
        fireTableDataChanged();
    }
    Voir la javadoc de AbstractTableModel, pour avoir l'usage de chaque méthode, au cas où tu voudrais implémenter d'autres méthodes (comme addClient(Client), ou removeClient(Client)).

    Attention, comme il est possible de modifier la liste de clients en dehors de la JTable, il faudrait également réagir à ces modifications de la même manière, sinon la JTable va avoir une vision erronée des données du modèle et tu risques fortement d'avoir des erreurs (par exemple, si tu supprimes un élément de la liste, la JTable ne le saura pas, et quand elle cherchera à accèder au dernier élément, tu obtiendras une IndexOutOfBoundException). Le mieux est d'enregistrer une copie de la liste dans le modèle (par exemple par ListClient = new ArrayList<>(listClient); dans setListClient), afin de ne pouvoir modifier les données du modèle qu'en passant par des méthodes du modèle, pour lesquelles tu auras pris soin d'appeler les bonnes méthodes du type fireXXX, afin que la JTable soit toujours au courant des modifications dans le modèle.

    PS: la convention en Java, pour les noms de variables, est qu'ils commencent toujours par une minuscule.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut
    Merci pour les conseils, ces liens me seront très utile.

    Pour revenir au sujet, j'ai entre temps fait quelque test, j'ai implémenté un constructeur pour ma classe ModeleClient, et passé mon ArrayList en paramètre de ma fenêtre pour faire dans ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //JTable jTable = new JTable(new ModeleClients(lstClient));
    Cela marche.

    Maintenant j'aimerai comprendre et rendre fonctionnel la méthode sur laquelle j'ai commencé. J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void setListClient(ArrayList<Client> listClient) {
    		ListClient = listClient;
    		fireTableDataChanged();
    	}
    Après des tests je me rends compte que je ne rentre jamais dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Object getValueAt(int rowIndex, int columnIndex)
    Je ne comprends pas pourquoi.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Tu peux me montrer toute ta classe ModeleClient finale ?

    PS: oui, si tu mets les données dans ton modèle (ce que tu fais par le constructeur) avant de le mettre dans la JTable, la JTable affichera bien les données (modèle non dynamique). D'ailleurs, même en appelant setListClient avant de mettre le modèle dans la JTable, ce serait le cas aussi.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2013
    Messages : 40
    Par défaut
    Voici ma classe ModeleClients

    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
    88
    89
    90
    91
    92
    93
    94
    95
    import java.awt.Color;
    import java.util.ArrayList;
     
    import javax.swing.table.AbstractTableModel;
     
     
    public class ModeleClients extends AbstractTableModel {
     
    	/**
             * Constructeur par défault
             */
    	public ModeleClients() {
    	}
     
    	/**
             * Constructeur
             * @param listClient
             */
    	/*public ModeleClients(ArrayList<Client> listClient) {
    		super();
    		ListClient = listClient;
    	}*/
     
    	private final String[]entetesColumn = {"Numero client", "Type de contrat", "Nom", "Ville", "Rue", "N° rue", 
    											"Code postale", "Téléphonne", "Téléphonne bis"};
     
    	/**
             * ArrayList Client
             */
    	private ArrayList<Client>ListClient = new ArrayList<Client>();
     
     
    	public ArrayList<Client> getListClient() {
    		return ListClient;
    	}
     
    	public void setListClient(ArrayList<Client> listClient) {
    		ListClient = listClient;
    		fireTableDataChanged();
    	}
     
        /**
         * Retourne le nombre de ligne du modele
         */
        @Override
        public int getRowCount() {
            return ListClient.size();
        }
     
    	/**
         * Retourne le nombre de colonne du modele
         */
        @Override
        public int getColumnCount() {
            return entetesColumn.length;
        }
     
        /**
         * Retourne le nom de la colonne à l'index columnIndex
         */
        @Override
        public String getColumnName(int columnIndex) {
            return entetesColumn[columnIndex];
        }
     
        /**
         * Retourne la valeur de la cellule à la valeur ligne/colonne
         */
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
        	System.out.println("Entrée dans méthode");
            switch(columnIndex) {
            case 0 :
            	return ListClient.get(rowIndex).getIdClient();
            case 1 :
            	return ListClient.get(rowIndex).getIdTypeClients();
            case 2 :
            	return ListClient.get(rowIndex).getNomClient();
            case 3 :
            	return ListClient.get(rowIndex).getVilleClient();
            case 4 :
            	return ListClient.get(rowIndex).getRueClient();
            case 5 :
            	return ListClient.get(rowIndex).getNumRueClient();
            case 6 : 
            	return ListClient.get(rowIndex).getCpClient();
            case 7 : 
            	return ListClient.get(rowIndex).getTel1Client();
            case 8 :
            	return ListClient.get(rowIndex).getTel2Client();
            default : 
            	throw new IllegalArgumentException();
            }    
        }
    }
    Je ne rentre jamais dans la dernière méthode. Mon ArrayList est bien remplis.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Là, en l'état, je ne vois pas où est le problème au niveau du modèle.

    Dans ton code d'origine de ta méthode main, on ne voit pas comment tu passes le modèle à FenetreTest (un oubli je suppose si tu dis que ça marche quand tu passes la liste dans le constructeur) : comment fais-tu pour transmettre le modèle rempli à la table qui l'utilise ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [Debutant]Afficher element du tableau string avec Random
    Par FITRI dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/01/2008, 11h11
  2. [MySQL] Comment affiché un résultat avec plusieurs lignes et plusieurs champs dans un tableau
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 15/05/2007, 14h19
  3. [JTable] afficher et interragir avec des URLs
    Par jean_bobi dans le forum Composants
    Réponses: 1
    Dernier message: 28/09/2006, 10h35
  4. [FPDF] Afficher un tableau php avec fdpf
    Par sami69 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 10/04/2006, 13h47
  5. Problèmes d'affiche du header de mon JTable avec un Model
    Par Baptiste Wicht dans le forum Composants
    Réponses: 16
    Dernier message: 08/02/2006, 18h37

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