Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Question sur les TableModel

7 réponses
Avatar
JavaBeaucoupMieux
Bonsoir à tous,

je suis programmeur autodidacte (c'est les pires !) et je me plonge un
peu plus loin dans Java.

J'ai l'intention de développer une petite application pour extraire des
données d'un fichier au format csv et les afficher dans une JTable.

En lisant divers docs et tutoriels, j'ai cru comprendre qu'un TableModel
est une sorte de lien entre les données et la JTable. Il semble falloir
implémenter les méthodes d'accès aux données de manière à ce que l'objet
JTable à qui l'on associe le TableModel "sache" comment remplir le
tableau (c'est à peu près ça, non ?)

Bon, alors ma question est la suivante : comment fait-on pour qu'un
TableModel ait accès à des données dont il ne connaît pas l'existence ?

Je m'explique : si je crée une classe modèle étendant (par exemple) un
AbstractTableModel, comment faire référence à l'objet instance de la
classe qui contiendra les données alors que mon modèle et ma classe de
données sont indépendants ?

class MonModel extends AbstractTableModel {

...

public TypeRetour getValueAt(int row, int column) {

// un truc du style

return donnees[row,column];

// sauf que donnees n'est pas défini dans MonModel ???

}

...
}

Qu'est-ce que j'ai loupé ?

Merci de m'aider à y voir plus clair.

7 réponses

Avatar
JavaBeaucoupMieux
Oups !!

return donnees[row,column];



Lire :

return donnees[row][column];
Avatar
1 connu
"JavaBeaucoupMieux" <@> a écrit dans le message de news: 4a8b29f2$0$9968$
Bonsoir à tous,

je suis programmeur autodidacte (c'est les pires !) et je me plonge un peu plus loin dans Java.

J'ai l'intention de développer une petite application pour extraire des données d'un fichier au format csv et les afficher dans
une JTable.

En lisant divers docs et tutoriels, j'ai cru comprendre qu'un TableModel est une sorte de lien entre les données et la JTable. Il
semble falloir implémenter les méthodes d'accès aux données de manière à ce que l'objet JTable à qui l'on associe le TableModel
"sache" comment remplir le tableau (c'est à peu près ça, non ?)



Le TableModel est le bien le modèle au sens MVC, la vue est la JTable et le contrôleur met tout ca en place et notifie le modèle en
cas de changement.

Bon, alors ma question est la suivante : comment fait-on pour qu'un TableModel ait accès à des données dont il ne connaît pas
l'existence ?



Si c'est bien au modèle de fournir les données à afficher lorsque la JTable va les lui demander. Il doit donc les lire directement
ou les demander à la classe spécialisée pour cela.

Je m'explique : si je crée une classe modèle étendant (par exemple) un AbstractTableModel, comment faire référence à l'objet
instance de la classe qui contiendra les données alors que mon modèle et ma classe de données sont indépendants ?

class MonModel extends AbstractTableModel {

...

public TypeRetour getValueAt(int row, int column) {

// un truc du style

return donnees[row,column];

// sauf que donnees n'est pas défini dans MonModel ???

}

...
}

Qu'est-ce que j'ai loupé ?

Merci de m'aider à y voir plus clair.




Avatar
Albert
JavaBeaucoupMieux a écrit :
Bonsoir à tous,

je suis programmeur autodidacte (c'est les pires !) et je me plonge un
peu plus loin dans Java.

J'ai l'intention de développer une petite application pour extraire des
données d'un fichier au format csv et les afficher dans une JTable.

En lisant divers docs et tutoriels, j'ai cru comprendre qu'un TableModel
est une sorte de lien entre les données et la JTable. Il semble falloir
implémenter les méthodes d'accès aux données de manière à ce que l'objet
JTable à qui l'on associe le TableModel "sache" comment remplir le
tableau (c'est à peu près ça, non ?)

Bon, alors ma question est la suivante : comment fait-on pour qu'un
TableModel ait accès à des données dont il ne connaît pas l'existence ?

Je m'explique : si je crée une classe modèle étendant (par exemple) un
AbstractTableModel, comment faire référence à l'objet instance de la
classe qui contiendra les données alors que mon modèle et ma classe de
données sont indépendants ?

class MonModel extends AbstractTableModel {

...

public TypeRetour getValueAt(int row, int column) {

// un truc du style

return donnees[row,column];

// sauf que donnees n'est pas défini dans MonModel ???

}

...
}

Qu'est-ce que j'ai loupé ?



Bah c'est à toi de définir donnees[][]. Tu peux faire:
* lecture du csv
* création d'un objet "MonModel" avec remplissage de "donnees"
* appel, sur ta jtable, de JTable.setModel() avec ton objet "MonModel"

Mais si tu n'as que "donnees" dans ton modèle de table, tu pourrais
utiliser un DefaultTableModel.
Avatar
Xavier Nayrac
JavaBeaucoupMieux a écrit :
Bon, alors ma question est la suivante : comment fait-on pour qu'un
TableModel ait accès à des données dont il ne connaît pas l'existence ?




C'est à toi de faire en sorte qu'il les connaisse :
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

--
Xavier Nayrac
http://personalbugtracker.free.fr
Avatar
JavaBeaucoupMieux
"1 connu" a écrit dans le message de news:
b33e2$4a8b9ec7$55da1e79$

Le TableModel est le bien le modèle au sens MVC, la vue est la JTable
et le contrôleur met tout ca en place et notifie le modèle en cas de
changement.



Si c'est bien au modèle de fournir les données à afficher lorsque la
JTable va les lui demander. Il doit donc les lire directement ou les
demander à la classe spécialisée pour cela.



Merci "1 connu",

le fait de poser la question par écrit (ici) m'a aidé à y voir plus
clair...

Je voyais le TableModel comme une passerelle entre la vue (au sens MVC)
et les données... Or, c'est justement le TableModel qui est le modèle
(au sens MVC)... « Bah, oui : c'est écrit d'ssus ! »

En fait, dans le cas où l'on dispose déjà d'une classe d'accès aux
données (un modème MVC), il suffit d'ajouter 'implements TableModel' et
d'implémenter les méthodes getRowCount(), etc. pour que cette classe
puisse être utilisée comme le TableModel, c'est bien ça, hein ?

Et dans le cas où, comme le dit Albert (merci Albert), on a juste un
tableau donnees[ ][ ], il suffit d'étendre la classe DefaultTableModel
...

Dans tous les cas, c'est le TableModel qui doit être la classe d'accès
aux données (Table M o d e l , Model au sens MVC du terme et non pas au
sens 'représentation' des données).

Citation Wikipédia :
(http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur ) : "Le
modèle représente le comportement de l'application : traitements des
données, interactions avec la base de données, etc. Il décrit ou
contient les données manipulées par l'application. Il assure la gestion
de ces données et garantit leur intégrité. Dans le cas typique d'une
base de données, c'est le modèle qui la contient. Le modèle offre des
méthodes pour mettre à jour ces données (insertion, suppression,
changement de valeur). Il offre aussi des méthodes pour récupérer ces
données. Les résultats renvoyés par le modèle sont dénués de toute
présentation. [...]"


C'est à toi de faire en sorte qu'il les connaisse :
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

--
Xavier Nayrac



Merci Xavier : je connaissais déjà ce tutoriel, mais je n'avais pas bien
compris l'utilisation du TableModel...

Maintenant, je crois que c'est bon. « Y'a plus qu'à » mettre ça au
propre et à coder !

Merci à tous les trois !
Avatar
1 connu
"JavaBeaucoupMieux" <@> a écrit dans le message de news: 4a8bc0c0$0$23535$

"1 connu" a écrit dans le message de news: b33e2$4a8b9ec7$55da1e79$

Le TableModel est le bien le modèle au sens MVC, la vue est la JTable et le contrôleur met tout ca en place et notifie le modèle
en cas de changement.



Si c'est bien au modèle de fournir les données à afficher lorsque la JTable va les lui demander. Il doit donc les lire
directement ou les demander à la classe spécialisée pour cela.



Merci "1 connu",

le fait de poser la question par écrit (ici) m'a aidé à y voir plus clair...

Je voyais le TableModel comme une passerelle entre la vue (au sens MVC) et les données... Or, c'est justement le TableModel qui
est le modèle (au sens MVC)... « Bah, oui : c'est écrit d'ssus ! »

En fait, dans le cas où l'on dispose déjà d'une classe d'accès aux données (un modème MVC), il suffit d'ajouter 'implements
TableModel' et d'implémenter les méthodes getRowCount(), etc. pour que cette classe puisse être utilisée comme le TableModel,
c'est bien ça, hein ?




Et dans le cas où, comme le dit Albert (merci Albert), on a juste un tableau donnees[ ][ ], il suffit d'étendre la classe
DefaultTableModel ...


Si tu as deja acces aux données, il suffit d'utiliser DefaultTableModel en passant les données au constructeur
ex : DefaultTableModel(Vector data, Vector columnNames)

Par contre, si tu veux les lire dans le modele
tu peux etendre AbstractTableModel
ex :
public class MonCSVModel extends AbstractTableModel {

private Vector mesDonnees; // ex un vecteur d'objets represent une ligne
public MonCSVModel ()
{
// remprir mesDonnes en lisant le fichier ou en accedant à une classe qui va les fournir
}
public Object getValueAt(int row, int col) {
{
MaLigne uneLigne = (MaLigne) mesDonnees.get(row);
switch(col) {
case 0:
return uneLigne.getAttributQuiVaBien();
case ....
}
}

Dans tous les cas, c'est le TableModel qui doit être la classe d'accès aux données (Table M o d e l , Model au sens MVC du terme
et non pas au sens 'représentation' des données).

Citation Wikipédia : (http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur ) : "Le modèle représente le comportement de
l'application : traitements des données, interactions avec la base de données, etc. Il décrit ou contient les données manipulées
par l'application. Il assure la gestion de ces données et garantit leur intégrité. Dans le cas typique d'une base de données,
c'est le modèle qui la contient. Le modèle offre des méthodes pour mettre à jour ces données (insertion, suppression, changement
de valeur). Il offre aussi des méthodes pour récupérer ces données. Les résultats renvoyés par le modèle sont dénués de toute
présentation. [...]"


C'est à toi de faire en sorte qu'il les connaisse :
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

--
Xavier Nayrac



Merci Xavier : je connaissais déjà ce tutoriel, mais je n'avais pas bien compris l'utilisation du TableModel...

Maintenant, je crois que c'est bon. « Y'a plus qu'à » mettre ça au propre et à coder !

Merci à tous les trois !






Avatar
JavaBeaucoupMieux
> Si tu as deja acces aux données, il suffit d'utiliser
DefaultTableModel en passant les données au constructeur
ex : DefaultTableModel(Vector data, Vector columnNames)

Par contre, si tu veux les lire dans le modele
tu peux etendre AbstractTableModel
ex :
public class MonCSVModel extends AbstractTableModel {

private Vector mesDonnees; // ex un vecteur d'objets represent une
ligne
public MonCSVModel ()
{
// remprir mesDonnes en lisant le fichier ou en accedant à une
classe qui va les fournir
}
public Object getValueAt(int row, int col) {
{
MaLigne uneLigne = (MaLigne) mesDonnees.get(row);
switch(col) {
case 0:
return uneLigne.getAttributQuiVaBien();
case ....
}
}



OK, j'ai pigé ! Merci pour cet exemple de code. Pour les données, je
n'avais pas pensé au Vector d'objets 'ligne' ! C'est une très bonne idée
vue que chaque ligne contient des données de natures très diverses...
Merci !

On peut même imaginer que l'objet ligne possède une méthode get(colonne)
avec la structure switch... Et le constructeur de la ligne de données
recevra une ligne du fichier csv en paramètre...

C'est nickel ! Merci bien !