Ok la je comprends mieux
Donc voila la fonction d'appel
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public void displayLegend() {
// Affichage de la légende
Metaphore leg = new Metaphore(); // Met "null" à la place
leg = (myTable.getTabMeta()[0].clone());
System.out.println(leg);
System.out.println(myTable.getTabMeta()[0]);
// ici les adresses de leg et myTable..getTabMeta()[0] sont bien différentes
int nb = leg.nbForme();
for (int i = 0; i < nb; i++) {
leg.getTabForme()[i].setLargeurForme((float) 30);
leg.getTabForme()[i].setTailleMinForme((float) 30);
}
System.out.println(myTable.getTabMeta()[0].getTabForme()[0].getLargeurForme());
legend.actualise(leg.sceneForme(false, true));
} |
Ma fonction clone dans la classe métaphore:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Override
public Metaphore clone(){
Metaphore clone=new Metaphore(); // A nouveau, initialise avec "null".
int i = 0;
try {
clone = (Metaphore) super.clone();
} catch (CloneNotSupportedException ex) {
ex.printStackTrace(System.err);
// Catcher sans renvoyer l'erreur fera qu'à la prochaine ligne, "clone" sera null et donc va certainement balancer des NullPointerException!!! à la place, fait ceci:
throw ex;
// ... ou alors, vire complètement ce bloc try/catch qui ne sert à rien dans ton cas
}
for (Forme f : tabForme) {
if (f != null) {
clone.tabForme[i] = f.clone();
}
i++;
}
clone.Nom = Nom;
return clone;
} |
et le clone de ma classe Forme:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public Forme clone() {
Forme plop = new Forme(); // toujours idem, "null"
try {
plop = (Forme) super.clone();
} catch (CloneNotSupportedException ex) {
ex.printStackTrace(System.err);
}
plop.largeurForme = largeurForme;
plop.tailleMinForme = tailleMinForme;
plop.couleur = couleur;
plop.forme = forme;
plop.tailleForme =tailleForme;
plop.nom = nom;
return plop;
} |
Donc la a priori le clonage fonctionne puisque qd je lance en debugger leg et myTable.getTabMeta()[0] ont bien les mêmes valeurs de champs et une adresse différente.
Pourtant lorsque je passe sur les instructions:
Code:
1 2
| leg.getTabForme()[i].setLargeurForme((float) 30);
leg.getTabForme()[i].setTailleMinForme((float) 30); |
Le programme modifie aussi myTable.TabMeta[0].