[newbie] demande éclaircissements transmission d'un objet entre deux classes
4 réponses
yvon.thoravalNO-SPAM
j'ai deux classes "VinePlantNewest" qui fabrique un model pour une
JTable (sorted) et "MaCaveNew" qui utilise ce model pour le présenter
dans un JScrollPane.
Le pb si je fais un model.getRowCount() dans VinePlantNewest j'obtiens
80, c'est OK, mais sur ce model, dans "MaCaveNew" j'obtiens 0 et de fait
ma JTable est vide.
je ne comprends pas, d'une manière générale, comment les objets sont
passés d'une classe à l'autre en java.
VinePlantNewest.java :
<code>
package yt.tables;
[tous mes import]
public class VinePlantNewest extends DefaultSortedTableModel {
public DefaultSortedTableModel model;
public VinePlantNewest() {
try {
[connection à la bd]
final DefaultSortedTableModel model = new
DefaultSortedTableModel(columns, rows);
[description de l'objet Row + setters et getters]
}
}
</code>
MaCaveNew.java :
<code>
package yt.ui;
[tous mes import]
public class MaCaveNew extends WindowAdapter
implements ActionListener {
private static void createAndShowGUI() {
DefaultSortedTableModel model = new VinePlantNewest();
final SortedTable view = new SortedTable(model);
view.setMakeIndex(true);
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
</code>
De plus, si je change le void de "VinePlantNewest" pour un
DefaultSortedTableModel avec les return qui vont bien, alors la classe
VinePlantNewest n'est pas appellée par MaCaveNew ...
Je précise que lorsque la partie correspondante à createAndShowGUI était
dans "VinePlantNewest" ca marchait très bien. Le but du changement est
que je souhaite choisir la classe par mon "ToolBarTables" et donc après
un click souris visualiser dans la JTable soit VinePlantNewest soit
Bottles etc...
Mais, il me semble que j'ai un pb de FOND quant à la compréhension de la
manière de passer des objets entre classes avec java ...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Benoît Chauvet
Yvon Thoraval wrote:
Le pb si je fais un model.getRowCount() dans VinePlantNewest j'obtiens 80, c'est OK, mais sur ce model, dans "MaCaveNew" j'obtiens 0 et de fait ma JTable est vide.
je ne comprends pas, d'une manière générale, comment les objets sont passés d'une classe à l'autre en java.
Le problème, c'est que dans le constructeur de VinePlantNewest, tu crées un objet model local, qui n'est pas le même que l'attribut du même nom. Déjà, ça, c'est louche...
De plus, j'ai l'impression que tu mélanges beaucoup de choses. Ta classe VinePlantNewest hérite de DefaultSortedTableModel (pourquoi pas), mais en plus, il contient un attribut de cette classe (model qui est public, ce qui en soit est choquant). Dans ce cas, pour que ca marche, ca veut dire que ta classe va fonctionner sur le principe de la délégation, et il va falloir que tu redéfinisses toutes les méthodes sur le modèle ci-dessous :
public int getRowCount() { return model.getRowCount(); }
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les informations nécessaires. Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Bon courage.
-- Orabîg
Yvon Thoraval wrote:
Le pb si je fais un model.getRowCount() dans VinePlantNewest j'obtiens
80, c'est OK, mais sur ce model, dans "MaCaveNew" j'obtiens 0 et de
fait ma JTable est vide.
je ne comprends pas, d'une manière générale, comment les objets sont
passés d'une classe à l'autre en java.
Le problème, c'est que dans le constructeur de VinePlantNewest, tu crées un
objet model local, qui n'est pas le même que l'attribut du même nom. Déjà,
ça, c'est louche...
De plus, j'ai l'impression que tu mélanges beaucoup de choses. Ta classe
VinePlantNewest hérite de DefaultSortedTableModel (pourquoi pas), mais en
plus, il contient un attribut de cette classe (model qui est public, ce qui
en soit est choquant).
Dans ce cas, pour que ca marche, ca veut dire que ta classe va fonctionner
sur le principe de la délégation, et il va falloir que tu redéfinisses
toutes les méthodes sur le modèle ci-dessous :
public int getRowCount()
{
return model.getRowCount();
}
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à
l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les
informations nécessaires.
Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de
VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Le pb si je fais un model.getRowCount() dans VinePlantNewest j'obtiens 80, c'est OK, mais sur ce model, dans "MaCaveNew" j'obtiens 0 et de fait ma JTable est vide.
je ne comprends pas, d'une manière générale, comment les objets sont passés d'une classe à l'autre en java.
Le problème, c'est que dans le constructeur de VinePlantNewest, tu crées un objet model local, qui n'est pas le même que l'attribut du même nom. Déjà, ça, c'est louche...
De plus, j'ai l'impression que tu mélanges beaucoup de choses. Ta classe VinePlantNewest hérite de DefaultSortedTableModel (pourquoi pas), mais en plus, il contient un attribut de cette classe (model qui est public, ce qui en soit est choquant). Dans ce cas, pour que ca marche, ca veut dire que ta classe va fonctionner sur le principe de la délégation, et il va falloir que tu redéfinisses toutes les méthodes sur le modèle ci-dessous :
public int getRowCount() { return model.getRowCount(); }
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les informations nécessaires. Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Bon courage.
-- Orabîg
yvon.thoravalNO-SPAM
Benoît Chauvet wrote:
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les informations nécessaires. Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Oui, oui, merci beaucoup pour tes explications, j'ai voulu aller trop vite...
j'ai refais cela plus "proprement" (je l'espère) :
parce que, sinon, je dois faire, dans Tasting, par exemple :
columns = {
new DefaultSortedTableColumn("Bouteille", Row.class.getDeclaredMethod("getBottle", null), Row.class .getDeclaredMethod("setBottle", new Class[]{String.class})),
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à
l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les
informations nécessaires.
Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de
VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Oui, oui, merci beaucoup pour tes explications, j'ai voulu aller trop
vite...
j'ai refais cela plus "proprement" (je l'espère) :
parce que, sinon, je dois faire, dans Tasting, par exemple :
columns = {
new DefaultSortedTableColumn("Bouteille",
Row.class.getDeclaredMethod("getBottle", null), Row.class
.getDeclaredMethod("setBottle", new
Class[]{String.class})),
L'objet "model" sera intialisé dans le constructeur (ce que tu fais, à l'erreur expliquée ci-dessus près), et c'est cet objet qui contiendra les informations nécessaires. Tu devrais d'ailleurs peut-être te limiter à TableModel comme objet père de VinePlantNewest, et ne surcharger que les méthodes de cette interface.
Oui, oui, merci beaucoup pour tes explications, j'ai voulu aller trop vite...
j'ai refais cela plus "proprement" (je l'espère) :
parce que, sinon, je dois faire, dans Tasting, par exemple :
columns = {
new DefaultSortedTableColumn("Bouteille", Row.class.getDeclaredMethod("getBottle", null), Row.class .getDeclaredMethod("setBottle", new Class[]{String.class})),
c'est bon, une subtilité que je ne pige pas pour l'instant...
-- yt
Lionel
Yvon Thoraval wrote:
par contre en plaçant devant columns la classe :
SortedTableColumn[] columns = {
c'est bon, une subtilité que je ne pige pas pour l'instant...
L'initialisation d'un tableau avec des {} ne peut se faire que lors de la déclaration du tableau. Sinon tu dois utiliser new. Tu devrais lire une doc sur la syntaxe, ça peut servir...
Yvon Thoraval wrote:
par contre en plaçant devant columns la classe :
SortedTableColumn[] columns = {
c'est bon, une subtilité que je ne pige pas pour l'instant...
L'initialisation d'un tableau avec des {} ne peut se faire que lors de la
déclaration du tableau.
Sinon tu dois utiliser new.
Tu devrais lire une doc sur la syntaxe, ça peut servir...
c'est bon, une subtilité que je ne pige pas pour l'instant...
L'initialisation d'un tableau avec des {} ne peut se faire que lors de la déclaration du tableau. Sinon tu dois utiliser new. Tu devrais lire une doc sur la syntaxe, ça peut servir...
yvon.thoravalNO-SPAM
Lionel <SPAMcoollATfreePOINTfr> wrote:
Tu devrais lire une doc sur la syntaxe, ça peut servir...
oui :) et la retenir, j'avais du lire ça qqpart ...
merci en tk -- yt
Lionel <SPAMcoollATfreePOINTfr> wrote:
Tu devrais lire une doc sur la syntaxe, ça peut servir...
oui :)
et la retenir, j'avais du lire ça qqpart ...