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 rempli avec un ArrayList<Objet>


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Par défaut JTable rempli avec un ArrayList<Objet>
    Salut à tous!
    J'ai un souci avec un JTable.
    Alors, je voudrais avoir un exemple de code qui me permettrait de remplir un JTable, avec des colonnes personnalisées (du style "Nom & Prénoms", "Date de naissance", "Fonction") et des lignes provenant d'un ArrayList.
    Pour rappel, le ArrayList provient en fait d'une méthode que récupère des données d'une base de données, en l'occurrence une table agent (nom,prenoms,datenaiss,fonction), qui les range dans un ArrayList et qui le retourne comme valeur de retour de la fonction.
    Le problème, c'est comment définir un modèle de table qui créera une table avec les données de ce ArrayList.

    NB: je ne veux passer par une conversion du ArrayList en Object[][].

    Merci d'avance!

  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,

    sous quelle forme sont les lignes dans la ArrayList ?

    Sinon, si tu veux directement utiliser ton ArrayList dans ton modèle de table, il suffit d'implémenter AbstractTableModel, ce qui ne présente aucune difficulté. Il y a trois méthodes à implémenter, dont le code est particulièrement évident, en fonction de ce que tu as dans ton ArrayList :

    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 class MyTableModel extends AbstractTableModel {
     
       private ArrayList list;		
     
       public MyTableModel(ArrayList list) {
           this.list=list;
       }
     
       @Override
       public Object getValueAt(int rowIndex, int columnIndex) {
    	// return ...; // la valeur pour la ligne rowIndex et la colonne columnIndex
       }
     
       @Override
       public int getRowCount() {
           return list.size(); // le nombre de lignes
       }
     
       @Override
       public int getColumnCount() {
           return ...; // le nombre de colonnes
       }
     
    };
    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 du Club
    Femme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Par défaut
    Merci pour ta bonne volonté.
    Il se trouve que j'ai effectivement essayé d'implémenter le modèle à l'aide de la classe AbstractTableModel comme tu l'avais dis; mais mon arrayList est composé d'une liste d'objets de la classe Agent définie comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private class Agent {
    private String nom;
    private String  prenoms;
    private String Fonction;
    . . .
    //getters et setters
    }
    Donc, après récupération des données de la BD, j'obtiens grâce à une méthode particulière un tel ArrayList:
    Et voilà comment j'ai déjà implémenté le 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    class ModeleTableAgent extends DefaultTableModel {
     
            public ModeleTableAgent(String [] colonnes, ArrayList<Agent> Liste){
                super(null,colonnes);
                this.ListeAgents = Liste;
                addRow(this.ListeAgents);
            }
     
            @Override
            public String getColumnName(int c){
                switch(c){
                    case 1: {
                        return "Nom & Prénoms";
                    }
                    case 2: {
                        return "Fonction";
                    }
                    case 3: {
                        return "Login";
                    }
                    default : JOptionPane.showMessageDialog(null, "Erreur!");
                }
                return "";
            }
     
            @Override
            public int getColumnCount() {
                return 3; //Il y a 3 colonnes dans notre tableau
            }
     
            @Override
            public Object getValueAt(int ligne, int colonne) {
                unAgent = ListeAgents.get(ligne);
                return intersectLigneColonne (unAgent, colonne);           
            }
     
            public Object intersectLigneColonne (Agent A, int col) {
                switch (col){
                    case 1: {
                        return A.getNom()+" "+A.getPrenoms();
                    }
                    case 2: {
                        return A.getFonction();
                    }
                    case 3: {
                        return A.getLogin();
                    }
                }
                return null;
            }
     
            public int getRowCount() {
                return ListeAgents.size();
            }
     
            private Agent unAgent;
            private ArrayList<Agent> ListeAgents;
        }
    Merci d'avance!

  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
    Le principal problème de ton implémentation est que tu traites les index de colonnes de 1 à 3, alors qu'ils vont de 0 à 2.

    Ensuite, moins important, inutile de faire le addRow, d'autant plus qu'il est faux : ta liste d'agents n'est pas qu'une ligne, mais plusieurs. C'est inutile de le faire, puisque que de toute manière, tu redéfinis toutes les méthodes. D'ailleurs, comme tu rédéfinis tous le comportement de DefaultTableModel, autant ne pas étendre cette classe.

    Tu peux faire comme ça :

    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
    public class MyTableModel extends AbstractTableModel {
     
    	private List<Agent> list;
     
    	public MyTableModel(List<Agent> list) {
    		this.list = new ArrayList<>(list);
    	}
     
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex) {
    		return getData(list.get(rowIndex), columnIndex);
    	}
     
    	public Object getData(Agent agent, int col) {
    		switch (col) {
    			case 0: {
    				return agent.getNom() + " " + agent.getPrenoms();
    			}
    			case 1: {
    				return agent.getFonction();
    			}
    			case 2: {
    				return agent.getLogin();
    			}
    		}
    		return null;
    	}
     
    	@Override
    	public String getColumnName(int column) {
    		switch (column) {
    		case 0: {
    			return "Nom & Prénoms";
    		}
    		case 1: {
    			return "Fonction";
    		}
    		case 2: {
    			return "Login";
    		}
    		}
    		return "";
    	}
     
    	@Override
    	public int getRowCount() {
    		return list.size(); // le nombre de lignes
    	}
     
    	@Override
    	public int getColumnCount() {
    		return 3; // le nombre de colonnes
    	}
     
    }
    Attention : ce modèle n'est pas prévu pour pour être mutable (donc pour ajouter, supprimer ou modifier des données dans la table).
    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 du Club
    Femme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 8
    Par défaut
    Merci pour l'aide!

    Alors j'ai deux autres questions:

    1. Comment utiliser ce modèle dans une JTable afin qu'il affiches les données de la liste
    2. Et comment puis-je m'arranger pour que lorsque l'utilisateur sélectionne une ligne, ce ne sont pas les données qui sont dans les cellules qui sont retournées, mais plutôt l'objet qui a permit de fabriquer cette ligne qui sera retourné. en fait, je veux utiliser cet objet dans un cadre qui affichera plus détails que la liste.


    Merci d'avance!

  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
    Pour utiliser le modèle, il suffit de le passer en paramètre au constructeur lors de l'instanciation de la JTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jtable=new JTable(new MyTableModel(listeAgents));
    Pour pouvoir récupérer les agents sélectionnés, ajoutes la méthode suivante à la classe MyTableModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Agent getAgent(int rowIndex) {
        return list.get(rowIndex);
    }
    Tu peux l'utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
     
       private Agent getAgent(int rowIndex) {
            return ((MyTableModel)table.getModel()).getAgent(rowIndex);
       }
     
       @Override
       public void valueChanged(ListSelectionEvent e) {
          if ( !e.getValueIsAdjusting() )
             System.out.println(getAgent(e.getFirstIndex()));
          }
    });
    Si tu en as besoin plusieurs fois, tu peux faire une abstraction.
    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. Problème de ListView avec une ArrayList d'objets
    Par zouky dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 24/08/2012, 00h40
  2. Réponses: 5
    Dernier message: 20/08/2008, 09h40
  3. [Jtable]Remplir un OBject[][] avec une ArrayList
    Par ArN0.VdB dans le forum Composants
    Réponses: 27
    Dernier message: 25/04/2007, 10h43
  4. [JTable] Cellule avec deux boutons
    Par cherbox dans le forum Composants
    Réponses: 3
    Dernier message: 12/08/2004, 17h26
  5. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31

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