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][AbstractTableModel][HashMap] problème lors du raffraichissement de la table


Sujet :

Composants Java

  1. #1
    Membre régulier Avatar de _KB_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 92
    Points
    92
    Par défaut [JTable][AbstractTableModel][HashMap] problème lors du raffraichissement de la table
    Hello,

    J'ai une JTable auquelle est associée un AbstractTableModel. J'ai un JComboBox qui me permet de sélectionner différents tableaux de donnés censés remplir la table.

    Ces tableaux sont dans une HashMap. On accède à un tableau par la valeur (String port) de ma JComboBox. A l'initialisation chaque tableau est identique (initialisé par le tableau "data")

    Mon problème se situe au niveau de la modification d'un tableau de la HasMap.
    Je modifie le tableau correspondant à la clé souhaitée, mais tous les tableaux de ma HashMap sont modifiés ...

    P.S: le refresh de ma JTable en fonction du tableau en paramètre d'entrée fonctionne.

    Voilà mon code :

    • création de la HashMap


    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
    private static final String data[][] = { 	
    			{"bit7", ANALOG, NO_IT},
    			{"bit6", ANALOG, NO_IT},
    			{"bit5", ANALOG, NO_IT},
    			{"bit4", ANALOG, NO_IT},
    			{"bit3", ANALOG, NO_IT},
    			{"bit2", ANALOG, NO_IT},
    			{"bit1", ANALOG, NO_IT},
    			{"bit0", ANALOG, NO_IT},
    			
    	};	
    private void createHashMapPortsDatas(int portsNumber) {
    		datasPortsMap = new HashMap<String, String[][]>();
    		String[] portsLabel = {PORT_A, PORT_B, PORT_C, PORT_D, PORT_E, PORT_F};
    		for (int i = 0; i < portsNumber; i++) {
    			String[][] dataHash = new String[8][3];
    			dataHash = data;
    			datasPortsMap.put(portsLabel[i], dataHash);
    		}
    		
    	}
    • écriture d'un élément de la table (selon valeur comboBox : port)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void fillInTable(String port, String text, int numBit, int colomn) {
    		
    		int index = Convert.numBitToIndex(numBit);
    		
    		/* get datas saved in HashMap */
    		String newDatas[][] = datasPortsMap.get(port);
    		newDatas[index][colomn] = text;
    		datasPortsMap.put(port, newDatas);
    			
    		myJTable.refresh(newDatas);
    	}
    • ma classe qui dérive JTable et son model :


    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
    package com.st.graphics;
    
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.Container;
    import java.awt.Dimension;
    
    
    
    public class MyJTable extends JPanel{
        private boolean DEBUG = false;
        private MyTableModel model;
    
        public MyJTable(String[] col, Object[][] datas) {
            model = new MyTableModel(col, datas);
            JTable table = new JTable(model);
            table.setPreferredScrollableViewportSize(new Dimension(700, 100));
    
            //Create the scroll pane and add the table to it.
            JScrollPane scrollPane = new JScrollPane(table);
    
            //Add the scroll pane to this panel.
            add(scrollPane);
           
        }
        public void refresh(Object[][] datas) {
        	model.setData(datas);
        }    public MyTableModel getModel() {
        	return model;
        }
    
        class MyTableModel extends AbstractTableModel {
            private String[] columnNames ;
            private Object[][] data ;
            public MyTableModel (String[] col, Object[][] datas) {
            	this.columnNames = col;
            	this.data = datas;
            }
            public int getColumnCount() {
                return columnNames.length;
            }
    
            public int getRowCount() {
                return data.length;
            }
    
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            public void setData(Object[][] newData){
            	data = newData;
            	super.fireTableDataChanged();
            }
            
    
                 [...]
    
       
    }
    merci beaucou
    Comme le disait Heisenberg « Chérie, j’ai garé la voiture, mais je sais plus où »

  2. #2
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Slt,

    public void setData(Object[][] newData){
    data = newData;
    super.fireTableDataChanged();
    }
    Si c'est ta variable static que tu modifies, je pense que ca risque de ne pas marcher car elle est supposee etre non modifiable.

    En plus je crois que tes deux tableaux sont egaux a data donc pointent vers la meme adresse. essai de faire un clone de ton tableau a l'initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Tableau t = data.clone()
    Je n'ai jamais essaye mais ca peut marcher.
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  3. #3
    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
    Points : 722
    Points
    722
    Par défaut
    Qu'est ce qui ne marche pas?

    Tu remplace les données de ta table avec les nouvelles datas, donc forcément c'est tes nouvelles datas qui sont affichées.

    Fais-tu du fillInTable() à chaque fois que tu veux afficher un nouvel élément de ta HashMap? Ou tout du moins, modifies-tu les données à afficher dans ta JTable?

  4. #4
    Membre régulier Avatar de _KB_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 92
    Points
    92
    Par défaut
    Merci pour tes propositions,

    Citation Envoyé par fumiste972
    Slt,



    Si c'est ta variable static que tu modifies, je pense que ca risque de ne pas marcher car elle est supposee etre non modifiable.
    c'est pas la même variable. Dans un cas c'est une constante et dans l'autre c'est une variable. En réalité j'ai 2 classes donc il y a pas de collision

    Désolé, présenté comme ça c'était pas clair.

    Citation Envoyé par fumiste972
    En plus je crois que tes deux tableaux sont egaux a data donc pointent vers la meme adresse. essai de faire un clone de ton tableau a l'initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Tableau t = data.clone()
    Je n'ai jamais essaye mais ca peut marcher.
    J'ai essayé...même résultat. J'ai même passé data en variable au cas ou (viré le "final static")

    Toujours pas

    [EDIT]

    Citation Envoyé par seiryujay
    Qu'est ce qui ne marche pas?

    Tu remplace les données de ta table avec les nouvelles datas, donc forcément c'est tes nouvelles datas qui sont affichées.

    Fais-tu du fillInTable() à chaque fois que tu veux afficher un nouvel élément de ta HashMap? Ou tout du moins, modifies-tu les données à afficher dans ta JTable?
    Nop c'est pas ça. Je modifie les éléments du tableau de ma HashMap et je vois le changement graphiquement sur ma JTable. Jusque là pas de problème. C'est quand je change d'élément via ma JComboBox (mettons j'étais sur le Port A je veux le port B), et bien il n'y a rien qui change.

    Et en affichant le tableau (réccuppéré dans ma HashTable avec la nouvelle clé (JComboBox) je m'aperçois que ce tableau a été modifié et contient les mêmes valeurs que le tableau précédent.

    En clair quand je met à jour un tableau je mets à jour tous les tableaux bizarement
    Comme le disait Heisenberg « Chérie, j’ai garé la voiture, mais je sais plus où »

  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
    Points : 722
    Points
    722
    Par défaut
    Ok, au temps pour moi...

    Donc ouais, je crois voir d'où vient ton problème et ça rejoint ce que dit fumiste972.

    En fait, à l'initialisation de ta HashMap, tu ajoutes x fois le même tableau "data" => tous pointent vers le même "objet-tableau".

    Quand tu fais ton fillInTable(), tu récupères le tableau "data"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datasPortsMap.get(port);
    Du coup, tu modifies 6 tableaux simultanément qui seront toujours identiques.

    Tu dois donc faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	private void createHashMapPortsDatas(int portsNumber) {
    		datasPortsMap = new HashMap<String, String[][]>();
    		String[] portsLabel = {PORT_A, PORT_B, PORT_C, PORT_D, PORT_E, PORT_F};
    		for (int i = 0; i < portsNumber; i++) {
    			String[][] dataHash = new String[8][3];
    			dataHash = data.clone();
    			datasPortsMap.put(portsLabel[i], dataHash);
    		}
     
    	}

  6. #6
    Membre régulier Avatar de _KB_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 92
    Points
    92
    Par défaut
    Moi aussi jevois d'ou vient l'erreur malheureusement ca doit être plus complexe que ça ...
    J'ai essayé avec ton correctif, le résulat est identique. La méthode clone justement ne permet t'elle pas de faire pointer les deux objet vers la même adresse, afin que la modif de l'un se répercute sur son clone ?

    en tout cas ca ne semble pas être ça la solution ..
    Comme le disait Heisenberg « Chérie, j’ai garé la voiture, mais je sais plus où »

  7. #7
    Membre actif Avatar de fumiste972
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2003
    Messages
    228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2003
    Messages : 228
    Points : 291
    Points
    291
    Par défaut
    Ouais j'avais eu ce pb une fois sur des objets et la seule solution que j'ai trouve mais qui reste tres barbare est de faire une boucle de la taille de ta hashmap et de recopier son contenu un par un dans le tableau destination plutot que de rechercher une egalite vers le tableau source.

    Mais bon le pb sera reporte aux elements du tableau maintenant. Si tu change la valeur d'un element d'un des tableaux, il sera modifie partout.
    "L'ignorance, c'est la béatitude, ce qui explique peut-être pourquoi tout le monde sourit"
    Pensez au tag , ca évite de se galérer pour rien.

  8. #8
    Membre régulier Avatar de _KB_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par fumiste972
    Mais bon le pb sera reporte aux elements du tableau maintenant. Si tu change la valeur d'un element d'un des tableaux, il sera modifie partout.
    c'est bien la le problème

    Sinon si qqn a une méthode différente pour un résulat identique ...

    En gros comment vous faites vous quand vous voulez charger dans une JTable plusieurs élments différents sans creer plusieurs model ou plusieurs JTable ?

    Je suis quand même pas le premier à souhaiter mettre à jour une JTable de la sorte
    Comme le disait Heisenberg « Chérie, j’ai garé la voiture, mais je sais plus où »

  9. #9
    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
    Points : 722
    Points
    722
    Par défaut
    Pour l'instant, moi j'ai utilisé un JTabbedPane dans lequel chaque onglet contient une JTable.

    Mais bon, je suis sûr qu'il doit y avoir une solution pour ne créer qu'une seule JTable...

  10. #10
    Membre régulier Avatar de _KB_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2006
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 110
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par seiryujay
    Pour l'instant, moi j'ai utilisé un JTabbedPane dans lequel chaque onglet contient une JTable.

    Mais bon, je suis sûr qu'il doit y avoir une solution pour ne créer qu'une seule JTable...
    Je pense que ma solution peut marcher une fois résolu le problème de modification d'un élément du tableau sans que celle ci se reporte à tous les tableaux de ma HashTable
    Je vous tiens au courant si je trouve une solution ... merci quand même

    [EDIT] Bon j'ai trouvé une solution au problème, pas très élégante mais ca fonctionne :

    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
    private void createHashMapPortsDatas(int portsNumber) {
    		datasPortsMap = new HashMap<String, String[][]>();
    		String[] portsLabel = {PORT_A, PORT_B, PORT_C, PORT_D, PORT_E, PORT_F};
    		for (int i = 0; i < portsNumber; i++) {
    			String[][] dataHash = new String[8][3];
    			// fill new table :
    
    			for (int j = 0; j < 8; j++) {
    				dataHash[j][0] = "bit"+j;
    				dataHash[j][1] = ANALOG;
    				dataHash[j][2] = NO_IT;
    			}
    
    			//dataHash = data.clone();	
    		datasPortsMap.put(portsLabel[i], dataHash);
    		}
    		
    	}
    J'ai mis le tag "résolu" mais si qqn trouve un moyen de copier mon tableau "data" dans chaque nouveau éléments "dataHash" sans les lier ca m'intéresse
    Comme le disait Heisenberg « Chérie, j’ai garé la voiture, mais je sais plus où »

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2014, 19h07
  2. Problème lors d'un select * from table
    Par smaildba dans le forum SQL
    Réponses: 1
    Dernier message: 12/11/2008, 12h36
  3. Problème lors d'un import de table
    Par niavlys77 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/09/2007, 13h59
  4. [JTable] Problème lors de la création via Vector
    Par Shurka dans le forum Composants
    Réponses: 6
    Dernier message: 13/08/2007, 12h48
  5. JTable et JComboBox : problème lors de l'édition
    Par Claythest dans le forum Composants
    Réponses: 13
    Dernier message: 25/04/2006, 18h18

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