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

[newbie] demande éclaircissements transmission d'un objet entre deux classes

4 réponses
Avatar
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);

int nbrow = model.getRowCount();
System.out.println("AVANT model.getRowCount() = " + nbrow);
#
#====> sortie console : 80
#
}
catch (Exception e) {[log de l'erreur]}
}

public static class Row {

[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);

int nbrow = model.getRowCount();
System.out.println("APRES model.getRowCount() = " + nbrow);
#
#====> sortie console : 0
#
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }

JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Ma Cave New");
Container contentPane = frame.getContentPane();
contentPane.add(new ToolBarTables(),
BorderLayout.NORTH);
contentPane.add(new JScrollPane(view),
BorderLayout.CENTER);
contentPane.add(new ToolBarManage(),
BorderLayout.EAST);
frame.setIconImage(getImage("images/icon.png"));
frame.pack();
frame.setLocationRelativeTo(null); //center it
frame.setVisible(true);
}

public void actionPerformed(ActionEvent e) {[...]}

protected static Image getImage(String pImg) {[...]}

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 ...

--
yt

4 réponses

Avatar
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

Avatar
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) :

j'ai défini une classe "Tables" :

public class Tables {

protected String driver;
protected String dbURL;
protected String dbUser;
protected String dbPass;
protected DBManager dbm;
//protected SortedTableColumn[] columns;
protected DefaultSortedTableModel model;
protected SortedTable view;
//protected String[] fields;
[...]
/**
*
*/
public Tables() {
driver = "org.hsqldb.jdbcDriver";
dbURL = "jdbc:hsqldb:file:data/macave";
dbUser = "yvon";
dbPass = "yvon5533";
dbm = new DBManager(driver, dbURL, dbUser, dbPass);
//columns = null;
model = null;
view = null;
//fields = null;
selection = "";
[...]
}

/**
* Gets the model
* @return DefaultSortedTableModel the SortedTable's model.
*/
public DefaultSortedTableModel getModel() {
return model;
}

[tous les autres getters et setters...]
}

puis, pour chaque Table (VinePlant, Bottles, Appellations, Tastiong...
je fais :

public class Tasting extends Tables {

/**
*
*/
public Tasting() {
try {
SortedTableColumn[] columns = {

[...]

et là ça roule, me reste un petit pb (d'où les // + haut)

je n'arrive pas à garder, dans Tables :

protected SortedTableColumn[] columns;
protected String[] fields;

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})),

[...]

et là, à la compil j'ai l'erreur :

[javac] /Users/yvon/Sites/hsqldb/src/yt/tables/Tasting.java:50:
illegal start of expression
[javac] columns = {
[javac] ^


par contre en plaçant devant columns la classe :

SortedTableColumn[] columns = {

c'est bon, une subtilité que je ne pige pas pour l'instant...

--
yt

Avatar
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...

Avatar
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