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

 Java Discussion :

Remplir une JTable avec une HashMap


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Remplir une JTable avec une HashMap
    Bonjour,

    Comme l'indique le titre, je dispose d'une Map<String, Joueur> et j'aimerais remplir ma JTable avec les données de ma map.

    Chaque colonne possède un nom fixe et je veux remplir les lignes avec les données des joueurs.(Mon objet joueur possède des attributs String du type nom prénom age club....)

    J'aimerais avoir un tableau comme ça :

    Nom : Capture.PNG
Affichages : 292
Taille : 8,3 Ko


    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
    	public void showtable (Map<String, Joueur> data) throws IllegalAccessException, NoSuchFieldException{
     
    		 String[] columnNames = new String[10];
     
    	        columnNames[0]="a";
    	        columnNames[1]="b";
    	        columnNames[2]="c";
    	        columnNames[3]="d";
    	        columnNames[4]="e";
    	        columnNames[5]="a";
    	        columnNames[6]="b";
    	        columnNames[7]="c";
    	        columnNames[8]="d";
    	        columnNames[9]="e";
     
     
     
     
    	        Object[][] dataForTable = getTableData(data, columnNames);
    	        JTable table = new JTable(dataForTable, columnNames);
     
    	        JFrame frame = new JFrame();
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        JScrollPane scrollPane = new JScrollPane(table);
    	        table.setFillsViewportHeight(true);
     
    	        frmTnr.getContentPane().add(scrollPane, BorderLayout.CENTER);
    	        frmTnr.setSize(900, 500);
    	        frmTnr.setVisible(true);
     
    	}
     
     
    	private static Object[][] getTableData(Map<String, Joueur> data, String[] columns) throws IllegalAccessException, NoSuchFieldException {
     
    	    Object[][] dataForTable = new Object[data.size()][columns.length];
     
    	    fot(int i =0; i<data.size();i++){
    	    for (int column = 0; column < columns.length; column++) {
    	    for (Map.Entry<String, Joueur> entry : data.entrySet()) {
     
     
     
    	            Joueur value = entry.getValue();
    	            String test = value.getNom();
    	            System.out.println(test);
     
    	            dataForTable[i][column] = test;
    	        }
    	    }
               }
     
    	    return dataForTable;
    	}
    Je ne sais pas si je suis sur la bonne piste mais je suis bloqué, je n'arrive pas a mettre chaque valeur de mon objet dans chaque cellule de mon tableau,

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    L'idée reste toujours de convertir la ligne et colonne en une valeur. Vous pouvez le faire via une boucle sur Map.keySet() mais vous devrez incrémenter l'indice de ligne dans la même boucle. Car actuellement vous multipliez les itérations des lignes (for(int i =0; i<data.size();i++)) et celle vos joueurs (for (Map.Entry<String, Joueur> entry : data.entrySet())).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Ce code n'a pas été testé..
            Iterator<Map.Entry<String, Object>> entries = data.entrySet().iterator();
            for (int i=0; entries.hasNext(); i++) {
                Map.Entry<String, Object> entry = entries.next();
                table[i][1] = entry.getKey();
                table[i][2] = entry.getValue().getXyz();
            }


    Idéallement vous devriez placer cette conversion dans une des sous classes de TableModel, ce serait plus clair:

    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
     
    // Ce code n'a pas été testé..
    public class PlayerTableModel extends AbstractTableModel {
     
        private final List<Entry<String, Joueur>> players;
     
        public PlayerTableModel(Map<String, Object> data) {
            this.players = new ArrayList<>(data.entrySet()); // Idealement trier les "entry" pour avoir un affichage consistent
        }
     
        @Override
        public int getRowCount() {
            return players.size();
        }
     
        @Override
        public int getColumnCount() {
            return columns.length;
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Entry<String, Joueur> player = players.get(rowIndex);
            switch (columnIndex) {
                case 1: return player.getKey();
                case 2: return player.getValue().getXyz();
            }
        }
    }
     
    // ...
    new JTable(new PlayerTableModel(data));

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je suis plutôt débutant en java et je n'arrive pas à adapter votre code au mien...

    Comment je dois structurer mon code et à quoi correspond la fonction : getXyz();

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par Law13000 Voir le message
    Comment je dois structurer mon code et à quoi correspond la fonction : getXyz();
    Vous structurez votre code comme vous le voulez. Mais, comme je vous l'ai suggéré, créer un nouvelle classe dédiée à ce modèle ne serait pas une mauvaise chose. Ensuite, toujours comme dans mon exemple, vous ajoutez directement ce modèle lorsque vous instanciez la JTable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          // Remplacez les lignes 2 à 20 de votre code par:
         JTable table = new JTable(new PlayerTableModel(data));

    La méthode getXyz() et juste un exemple. Pour ne pas retaper tout votre code j'ai mis entry.getValue().getXyz() pour signaler que c'était à vous de décider quelle méthode de Joueur appeler pour chercher la valeur de la cellule. Si la colonne 1 doit afficher le nom, alors sur le case 1 vous retournez player.getValue().getNom()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Entry<String, Joueur> player = players.get(rowIndex);
            switch (columnIndex) {
                case 0: return player.getValue().getNom();
                case 1: return player.getValue().getPrenom();
                case 2: return player.getValue().getAge();
                case 3: return player.getValue().getClub();
                case 5: return player.getValue().getScore();
                case 5: return player.getValue().getType();
            }
        }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    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
    public class Page {
     
    	private JFrame frmTnr;
     
     
    	/**
             * Launch the application.
             */
    	public static void main(String[] args) {
     
     
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					Page window = new Page();
    					window.frmTnr.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the application.
             */
    	public Page() {
    		initialize();
     
    	}
     
    	/**
             * Initialize the contents of the frame.
             */
    	private void initialize() {
    		frmTnr = new JFrame();
    		frmTnr.setTitle("TNR");
    		frmTnr.setBounds(100, 100, 606, 408);
    		frmTnr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frmTnr.getContentPane().setLayout(new CardLayout(0, 0));
     
    		String fileName = "test.xml";
            List<Joueur> joueurList = StaxXMLReader.parseXML(fileName);
     
            HashMap<String, Joueur> team = new HashMap<String, Joueur>() ;
        	team = Team.creationMap(joueurList);
     
        	try {
    			showtable (team);
    		} catch (IllegalAccessException | NoSuchFieldException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
     
    	public void showtable (Map<String, Joueur> data) throws IllegalAccessException, NoSuchFieldException{
     
    			JTable table = new JTable(new PlayerTableModel(data));
     
     
    	        JFrame frame = new JFrame();
    	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	        JScrollPane scrollPane = new JScrollPane(table);
    	        table.setFillsViewportHeight(true);
     
    	        frmTnr.getContentPane().add(scrollPane, BorderLayout.CENTER);
    	        frmTnr.setSize(900, 500);
    	        frmTnr.setVisible(true);
     
    	}
     
     
    }

    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 PlayerTableModel extends AbstractTableModel {
     
        private final List<Entry<String, Joueur>> players;
     
        public PlayerTableModel(Map<String, Joueur> data) {
            this.players = new ArrayList(data.entrySet()); // Idealement trier les "entry" pour avoir un affichage consistent
        }
     
        @Override
        public int getRowCount() {
            return players.size();
        }
     
        @Override
        public int getColumnCount() {
            return columns.length;
        }
     
     
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Entry<String, Joueur> player = players.get(rowIndex);
            switch (columnIndex) {
               case 0: return player.getValue().getNom();
                case 1: return player.getValue().getPrenom();
                case 2: return player.getValue().getAge();
                case 3: return player.getValue().getClub();
     
     
            }
            return null;
        }
     
     
    }
    J'ai essaye de faire ça, ca marche mais j'ai pas mal de warning que je ne comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class PlayerTableModel extends AbstractTableModel {
    The Serializable PlayerTableModel class does not declare a static final seruakVersuibUID

  6. #6
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par Law13000 Voir le message
    The Serializable PlayerTableModel class does not declare a static final seruakVersuibUID
    C'est un warning qui peut-être caché, il n'est "utile" que si vous sérialisez cette classe:

    [..] A SerialVersionUID identifies the unique original class version for which this class is capable of writing streams and from which it can read. [..]

    If the class has defined serialVersionUID it is retrieved from the class. If the serialVersionUID is not defined by the class, it is computed from the definition of the class in the virtual machine. If the specified class is not serializable or externalizable, null is returned. [..]

    -- https://docs.oracle.com/javase/8/doc...pec/class.html
    Si vous voulez vous en débarrasser, ajoutez simplement private static final long SerialVersionUID = 1l; dans votre classe.

    Quels sont les autres warnings dont vous parlez ?


    Notez que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            HashMap<String, String> team = new HashMap<String, String>();
        	team = Team.creationMap(joueurList);
    Peut-être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            HashMap<String, String> team = Team.creationMap(joueurList);

  7. #7
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour tes explications, tout fonctionne correctement.

    Est-il possible de choisir les colonnes à afficher de ma JTable, admettons que je veux juste afficher la colonne A B D E.

  8. #8
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    Pour la cohérence et la richesse de ce forum, je pense qu'il est préférable de créer une nouvelle question dédiée. Précisez si vous voulez que le choix soit dynamique (l'utilisateur choisi) ou "fixe".


    Pensez à marquer cette question comme résolue.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2021
    Messages : 11
    Points : 11
    Points
    11

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

Discussions similaires

  1. Remplir un JTable avec une base de donnée
    Par WiZarD67 dans le forum Composants
    Réponses: 6
    Dernier message: 20/11/2019, 08h31
  2. remplir une hashMap à partir d ' arrayList
    Par j2ee60 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/06/2011, 20h05
  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. Réponses: 9
    Dernier message: 15/05/2006, 16h23
  5. [SWING] remplir une jtable avec une matrice de double
    Par Psykorel dans le forum Composants
    Réponses: 3
    Dernier message: 04/01/2006, 14h14

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