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

AWT/Swing Java Discussion :

TableModel, comment le compilateur fonctionne ?


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut TableModel, comment le compilateur fonctionne ?
    J'ai hésité a poser la question sur le général vu que même si ca touche au Jtable c'est au niveau du compilateur que ma question se passe, si jamais un modo prefer le déplacer ^^

    Après plusieurs heures a peter un cable sur comment marche le TableModel pour pouvoir (entre autre) ajouter des ligne, j'ai enfin compris qu'il faut juste crée des paramètres data et columnNames selon le type voulu. Je ne comprenais pas pourquoi dans tout les tuto on ne montre jamais le constructeur, ou à quel moment on dit tel élément de la liste va à tel colone.
    Mais, je ne comprend pas comment le compilateur fait pour savoir que soit la liste de String data (ou powet peut importe le nom) de la class, il doit prendre les éléments et les metres dans la colones correspondantes ...

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu ne dois pas avoir l'esprit clair la dessus, car ce que tu as écris est limite incompréhensible...

    Essaie de reposer ta question en montrant des exemples clairs de ce que tu ne comprends pas.

    Basiquement tu donne l'ordre de tes colonnes dans le tableau, le vector ou la liste que tu vas passer au model.

    Enfin le plus simple pour toi serait de regarder le code du DefaultTableModel qui se trouve dans le fichier src.zip fourni avec le JDK.

    Un tableModel est quelquechose de très simple au final.

    C'est un vulgaire tableau dans lequel la JTable va piocher des données. Pas grand chose de plus.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    Pour faire simple :

    Le plus facil c'est de faire un tableModel qui extends AbstractTableModel.

    Puis tu redefini les methodes

    getColumnCount
    getRowCount
    getColumnName
    getValueAt()
    etc etc

    Ensuite quand tu associe le model de table a la vue, c'est la vue qui va interagir avec le model pour afficher les données correctement.
    Tout d'abord la vue va construir les entete de colonne avec le getColumnName() que tu aura defini

    Puis avec l'ensemble des autre méthode elle va remplir la table.
    Si par exemple dans la méthode getValueAt(col, row) tu retourne "coucou" comme valeur, alors dans toutes les case de ton tableau il y aura coucou d'affiché.

    J'espere t'avoir un peu aidé...

  4. #4
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Dison que j'ai compris l'utilisation du model, mais pas comment il marche.

    Ce que je ne comprend pas, c'est que je n'ai qu'à ecrire les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private ArrayList data = new ArrayList();
    private String[] columnNames = new String[]{"Type", "Rang", "Code", "Libele", "Nombre"};
    Pour que le programme sache que data va correspondre aux lignes, et columnNames aux colones.
    J'aurais pensé qu'on aurait du créer un constructeur appellant la classe mère avec ces deux paramètres, mais non. A aucun moment on ne dit tel ou tel paramètre sera la ligne, et lui la colone. Alors comment lui le sait ?

    Alors soit j'ai eu une chance de pendu (ca me changera ca tient ) pour que cela donne ce que je veux avec le code que j'ai écris, soit il ya un truc que j'ai raté.

    Voici au cas ou ma class, même si elle n'a à priorie rien de particulier.


    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
     
    public class TableauQuestionTableModel extends AbstractTableModel 
    {
    	private ArrayList data = new ArrayList();
    	private String[] columnNames = new String[]{"Type", "Rang", "Code", "Libele", "Nombre"};
     
    	public void addNewRow(int ligne, String libelle, String code, String type) 
    	{
    		if(data.size()==0)
    		{
    			data.add(0,new String[]{type, (new Integer(1)).toString(), code, libelle, (new Integer(0)).toString()});
    		}
    		else
    		{
     
     
    			data.add(ligne, new String[]{type, (new Integer(ligne+1)).toString(), code, libelle, (new Integer(0)).toString()});
    		}	
    		this.fireTableStructureChanged();
    	}
     
     
    	public void removeNewRow(int ligne) 
    	{
    	if (getRowCount() == 0 || ligne < 0)
    	return;
    		data.remove(ligne);
    		this.fireTableStructureChanged();
    	}
     
     
    	public int getColumnCount() 
    	{
    		return columnNames.length;
    	}
     
    	public int getRowCount() 
    	{
    		return data.size();
    	}
     
    	public String getColumnName(int col) 
    	{
    		return columnNames[col];
    	}
     
    	public Object getValueAt(int row, int col) 
    	{
    		String []o=(String[])data.get(row);
    		return o[col];
     
    	}
     
    	public Class getColumnClass(int c) 
    	{
    		return getValueAt(0,c).getClass();
    	}
     
    	public boolean isCellEditable(int row, int col) 
    	{return (col < 2);
     
    	}
     
    	public void setValueAt(String value, int row, int col) 
    	{
    		String []o=(String[])data.get(row);
    		o[col]=value;
    		fireTableCellUpdated(row,col);
    	}

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    En effet tu a un petit prblm de comprehension du mécanisme

    Ce qui fait que sa fonctionne c'est par exemple pour le nom des colonne, le fait que tu aies redefini la méthode getColumnNam()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public String getColumnName(int col) 
    	{
    		return columnNames[col];
    	}
    et tu a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String[] columnNames = new String[]{"Type", "Rang", "Code", "Libele", "Nombre"};
    du coup lorsque tu va associer le model a la vue, pour le nom des colonnes cette derniere va dabord regarder combien il y a de colonne en appelant la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public int getColumnCount() 
    	{
    		return columnNames.length;
    	}
    puis elle va iterer la méthode getColumnName() de 0 jusqu'a la valeur retourné par getColumnCount().
    Si tu avait appelé le tableau contenant le nom de tes colone autrement que columnName cela n'aurai pas marché ou alors il aurai aussi fallu que tu change les méthodes getColumnCount() et getCOlumnName()


    C'est pareil pour la lecture des données du model...

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le mieux est tout simplement de regarder un TableModel bien écrit.

    En pièce jointe tu as le DefaultTableModel de Sun fourni avec java, c'est un bon point de départ.
    Fichiers attachés Fichiers attachés
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Ok merci bien, je n'avais pas compris comment cela se construisait. Merci beaucoup ^^

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

Discussions similaires

  1. [C++] Pourquoi et comment ce code fonctionne ?
    Par chronos dans le forum Débuter
    Réponses: 22
    Dernier message: 22/09/2008, 17h47
  2. [Django] Comment le faire fonctionner sous Windows
    Par Gregory.M dans le forum Django
    Réponses: 2
    Dernier message: 12/04/2008, 13h02
  3. Comment un compilateur lie les librairies
    Par _Michel dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 19/08/2007, 15h46
  4. Réponses: 4
    Dernier message: 13/08/2007, 11h48
  5. Réponses: 1
    Dernier message: 02/06/2005, 19h23

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