Aller au contenu

[Java]Probleme de clonage


austinpower

Messages recommandés

Bonjour,

j'ai écris le programme de Test suivant pour essayer de copier une table mais j'obtiens le message suivant :

The method clone() from the type Object is not visible	line 29

la ligne 29 est la suivante :

Table table2 = (Table)table.clone();

Voici le code :

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class Table extends JTable implements Cloneable{
private static final long serialVersionUID = 1L;
private JTable table;
public Table(JTable table){
	this.table = table;
}

public Table clone(){
	Table table = new Table(this.table);
	return table;
}

public static void main(String [] args){
	JTable table = new JTable(4,5);
	JScrollPane scroll = new JScrollPane(table);
	JFrame frame = new JFrame("Initial");			
	frame.setSize(600,250);
	frame.add(scroll);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	Table table2 = (Table)table.clone();
	JScrollPane scroll2 = new JScrollPane(table2);
	JFrame frame2 = new JFrame("Copie");			
	frame2.setSize(600,250);
	frame2.add(scroll2);
	frame2.setVisible(true);
	frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Je voudrai savoir comment corriger cette erreur et si c'est bien comme cela qu'il faut faire pour copier une table

Merci

Lien vers le commentaire
Partager sur d’autres sites

Dans Object, la méthode clone() est déclarée "protected", ce qui veut dire que tu peux appeler clone() depuis :

1. Object lui-même,

2. les classes du même package (java.lang),

3. de manière interne depuis n'importe quelle sous-classe d'Object.

Pour 1. et 2. c'est mort puisque tu ne vas pas modifier le code de Object, et que tu ne peux placer aucune classe personnelle dans java.lang.

Pour 3., cela veut dire que seule la classe JTable peut appeler clone() de manière interne puisqu'elle hérite cette méthode de Object. Donc pour toi, c'est mort aussi, à moins de sous-classer JTable et de redéfinir clone() dans cette sous-classe (car le clone() de Object effectue juste un clonage de surface), sans oublier de lui donner l'accès "public". Mais c'est pas super propre non plus.

Le plus simple dans ton cas serait d'écrire une méthode utilitaire qui copie une JTable passée en entrée.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

J'ai du mal à saisir pourquoi tu as une variable d'instance de la classe que tu étends.

Pour moi, soit tu étends JTable et tu redéfinis ce dont tu as besoin, soit tu crées une classe qui englobe JTable et tu dois tout redéfinir.

Mais Sentinel, puisqu'il étend JTable, pourquoi ne pourrait-il pas implémenter clone() en la laissant protected ?

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...