dupliquer un objet - Java - Programmation
Marsh Posté le 12-06-2006 à 14:46:50
Pourquoi tu ne crées pas une méthode clone() dans ton objet, qui créerait un nouvel objet StyledDocument en remplissant les membres internes de ce nouvel objet en copiant ses propres membres internes? et je dis bien en copiant, pas en re-faisant du passage par paramètre, pour ne pas retomber dans ton problème.
Marsh Posté le 12-06-2006 à 15:57:03
oulala je ne te suis pas trop
aurais tu un petit exemple? c'est surtout l'histoire des membres internes, comment les copierais tu?
Merci de ton aide!
Marsh Posté le 12-06-2006 à 16:06:28
predateuraud a écrit : oulala je ne te suis pas trop |
google shallow copy deep copy
Marsh Posté le 12-06-2006 à 16:17:02
Bon prenons l'exemple suivant:
Code :
|
Dans cet exemple, tu as un constructeur de MaClasse sans paramètre et un autre avec paramètre. Le second constructeur permet de créer un nouvel objet en précisant dès l'origine quelles seront les valeurs de ses membres internes.
Ainsi dans le programme, tu devras trouver qqch du genre:
Code :
|
Quand tu appelles objet1.clone(), objet1 crée directement un nouvel objet du type MaClasse en mettant dans ce nouvel objet des objets qui sont les clones des membres internes de objet1.
P.ex. si Object1 est un int, la copie est directe. Si Object2 est un String et que tu faisais dans Clone()
Code :
|
alors dans ce cas, le membre objet2 de la première instance de classe et celui de son clone pointeront vers le meme objet chaineDeCaractère, ce que tu ne veux pas. Tu dois donc t'assurer que tous les objets internes que tu veux retrouver dans le clone ont les mêmes valeurs que dans l'instance de départ, mais sont des objets différents.
Note que tu n'es pas obligé de créer un constructeur surchargé spécifique pour faire ça; tu aurais assigner les valeurs du clone directement dans la méthode clone();
Marsh Posté le 12-06-2006 à 16:44:14
si j'ai bien compris:
j'ai créé une classe qui implémente DefaultStyledDocument. Cette classe possède un constructeur qui prend en paramétre un String. Si je ne me trompe pas, le seul élément interne à un ...Document est le texte qu'il contient. Voici mon constructeur suivi de ma méthode clone.
public MyDefaultStyledDocument(String t){
this.texte=t;
}
public MyDefaultStyledDocument cloneDoc() {
MyDefaultStyledDocument copieDoc = new MyDefaultStyledDocument(this.texte.clone()) ;
return copieDoc;
}
Le problème est que je ne peux pas compiler puisque le "this.texte.clone()' ne va pas. peux tu me dire où est mon erreur?
Marsh Posté le 12-06-2006 à 16:48:08
[]
Serveur en cours de maintenance.
Veuillez nous excuser pour la gêne occasionnée[/]
Marsh Posté le 12-06-2006 à 16:50:44
en ce qui concerne l'idée de 'deep copy', je pense que c'est ce qu'il me faut mais je crois qu'il faut aussi utiliser la méthode clone pour faire cela, non?
Marsh Posté le 12-06-2006 à 16:56:42
Héhé
je voulais dire que dans le cas d'objets complexes, tu dois appliquer le meme principe sur tous les objets.
En l'occurrence pour cloner un String en Java, c'est assez compliqué:
Code :
|
On doit même réussir à faire encore plus compliqué en se creusant bien la tête ....
Mais bon est-ce que ça vaut la peine de se creuser trop la tête si c'est juste pour travailler sur un String?
autant faire
Code :
|
et hop
Marsh Posté le 12-06-2006 à 16:57:47
Pardon j'aurais pas du prendre clone comme nom vu que c'est une méthode de la classe Object et que ça peut préter à confusion.
Remplace clone() par copy(), ce sera plus lisible.
Marsh Posté le 12-06-2006 à 17:02:13
en fait, ce que je veux reellement copier c'est un DefaultStyledDocument et non la chaine de caractéres qu'il contient mais vu que tu me disais de prendre les éléments internes, je me suis dit qu'il n'y avait que celui la. Je t'avoues que je suis un peu perdue
Faut-il que je conserve la classe que j'ai créée? Faut-il essayer de cloner le String et non le document?
Marsh Posté le 12-06-2006 à 17:12:12
Ben là je dirai que ça dépend de la complexité de ce que tu veux faire.
Si l'objet que tu veux dupliquer est conséquent (genre plein de variables internes...) et surtout si tu veux l'utiliser en tant qu'objet DefaultStyledDocument à part entière (pour réutiliser des méthodes que tu as déjà et qui travaillent sur des objets de type DefaultStyledDocument ), alors oui il vaut mieux en faire une copie complète.
Si tu veux juste travailler sur un seul membre de ton objet, ça ne vaut pas forcément la peine. C'était juste ce que je voulais mettre en avant.
Le principe du "deep copy" comme tu dis, à mon avis est celui qu'il faut utiliser. Ensuite pour ce qui est de la méthode clone() de la classe Object, d'après la javadoc
Citation : this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation. |
donc moi je te conseille d'implémenter ton propre copy() (et non clone pr éviter les amalgames) pour êter sur de ce que tu obtiens.
Marsh Posté le 12-06-2006 à 17:19:46
je vais essayer de t'expliquer ce que je souhaite faire:
j'ai un éditeur de texte qui est donc composé d'un Document. J'ai des problèmes concernant les tableaux (puisque le format rtf ne les prend pas en compte). La solution que j'ai adoptée est donc de savoir à l'aide d'un mot clé lorsqu'il y a un tableau dans le texte. Ce texte est récupérable grace a document.getText() (renvoie un string).
Ce qui se passe actuellement est que quand j'enregistre mon fichier, il enregistre en faite le document. (texte sans les tableaux). Ce que je souhaite faire est créé une copie (ou un clone) de ce document puis d'y insérer des mots clés :
mot clé pour dire qu'il y a un tableau, suivi du nb de ligne, du nb de colonne puis du contenu (ca on verra plus tard!!)
en résumé, je souhaite que l'utilisateur ne voit que le document actuel
et que derrière, j'ai un autre document, qui est une copie de celui affiché, mais ce document contient d'autres renseignements concernant le tableau. Ce document ne doit évidemment pas être visible par l'utilisateur.
j'espère que tu as compris ce que je viens de raconter!!
pour te repondre, je pense aussi que le principe du 'deep copy' est ce qu'il me faut mais je n'ai absolument pas d"idée sur la manière dont procéder!
Merci de m'aider
Marsh Posté le 12-06-2006 à 17:41:40
je crois avoir plus ou moins compris, mais à ta place je ferai l'inverse: tu gardes le doc en entier avec tes mot-clefs specifiques, et quand tu veux afficher, tu as p.ex. une méthode renderText() qui te renvoit uniquement le texte que l'utilisateur doit lire.
Il faut bien voir que si tu crées 2 documents pour le même texte, tu risque très fortement d'avoir des pb de synchronization entre les deux. Perso j'opterai plutôt pour un seul document qui "présente" les données en fonction de ce que l'on souhaite afficher.
Marsh Posté le 13-06-2006 à 08:42:17
bonjour! me revoilà au boulot!
je vais étudier la méthode renderText() car d'apres ce que tu me racontes, ca serait exactement ce qu'il me faut! merci de ton aide!!!
Marsh Posté le 13-06-2006 à 09:30:59
hélas, je ne trouve pas grand chose... cette méthode s'applique a quel type d'objet? dois-je la créer moi même? si quelqu'un a un lien intéressant concernant 'renderText', je suis prenante!
Marsh Posté le 13-06-2006 à 13:32:39
Désolé de t'avoir donné un faux espoir, mais renderText() c'est juste un exemple pour décrire ce que cette méthode devrait faire. Après l'implémentation effective, c'est à toi de le faire, donc oui tu dois créer une méthode qui prend le document en entier, supprime ce que l'utilisateur n'est pas censé voir et te retourne le champ texte à afficher.
Marsh Posté le 13-06-2006 à 14:25:41
supposons que je créée une méthode qui prend mon document, qui récupère la chaine de caractere qui lui est associé, qui supprime ce que l'utilisateur ne doit pas voir et qui renvoie cette chaine de caractère, comment je fais après pour l'afficher? il n'existe pas de méthode setText() pour les documents.
Ne crois tu pas que le plus simple était ma solution de départ : faire une copie de l'objet Document?
Désolée, je suis vraiment paumée!!
Marsh Posté le 14-06-2006 à 11:29:47
Salut,
là désolé c'est moi qui suis paumé.
L'affichage de ton document, je ne sais pas comment tu as prévu de le faire, mais ça doit être dissocié de ton document. En fait je ne vois pas le problème et surtout pas le rapport.
Mais d'abord qq tu veux réellement faire avec ton objet dupliqué, pq ça devient un peu confus là.
Et non je ne pense pas que dupliquer ton objet (si c'est pour l'afficher) est une bonne solution. A mon sens, en objet, tu représentes un objet comme tu le concevrais sur le papier. Un document est un et si tu copies ton document, tu as une copie conforme de ce document, mais qui n'est pas ton document. C'en est un autre mais qui a le même texte. Y'a qd m une nuance.
Marsh Posté le 14-06-2006 à 15:40:16
salut
bon,je récapitule un tit peu :
J'ai un JTextPane qui est associé à un DefaultStyledDocument et à un rtfEditorKit.
J'ai reussi a ajouter un tableau à ma zone de texte, cependant, le format rtf ne permet pas leur enregistrement.
La solution que j'ai adoptée est que lorsque je souhaite enregistrer, je parcours mon texte et lorsque je trouve mon mot clé (document.insertString(p, " motCle", attr)) je voudrais avoir une copie de ce document pour que je puisse (sur cette copie) rajouter la taille de mon tableau et son contenu. Ces éléments ne sont que du texte puisque je veux enregistrer en rtf mais l'utilisateur ne doit rien voir à ces rajouts.
Ma copie serait donc la même chose que mon document mais posséderait en plus, les caractéristiques de mon tableau alors que mon document original aurait le tableau dessiné et l'utilisateur ne verrait rien.
Mon but est donc de faire une copie de document, je ne pense pas qu'avoir l'original change quelque chose, afin de pouvoir sauvegarder mes tableaux pour les retrouver lors d'une future ouverture du fichier via mon application.
J'ai trouvé un petit truc qui permet de faire ce que je veux : créer un nouveau document et faire un insertString afin de lui insérer le texte du document original. Ceci fonctionne mais ne prend absolument pas en compte la mise en forme du texte. J'en conclu donc que ca ne va pas!
J'espère avoir été claire, désolée si ma reflexion est mauvaise...
Marsh Posté le 14-06-2006 à 17:21:32
Ok, je comprends mieux comme ça.
D'abord désolé mais je ne suis pas encore upgradé Java1.5. J'en suis resté au 1.4, donc c'est vrai que les EditorKits je connais pas trop. Surtout j'avais mal compris quels objets tu veux utiliser... mea culpa.
En fait pour résumer, tu veux faire du RTF mais en rajoutant des balises spécifiques pour le formatage d'un tableau, j'ai bon ?
J'aurais ta tendance à ta place à créer une classe qui étend RTFEditorKit et qui, lorsque il lit ta balise fais le traitement spécifique que tu veux et sinon fais le traitement par défaut du RTFEditorKit.
Peut-être un JEditorPane est-il aussi plus adapté qu'un JTextPane .
Par contre pour ce qui est de la copie du format du texte en plus du texte, je pense que tu devrais regarder du côté des méthodes read et write sur RTFEditorKit plutôt que insertString() (qui sonne "plain text" ).
J'espère que ça aide un petit peu.
Marsh Posté le 15-06-2006 à 10:25:40
bonjour!
contente que tu ai compris! en y reflechissant, j'ai aussi un autre problème : je ne connais pas trop non plus les rtfeditorkit!! a force de faire des recherches, j'ai reussi a créer ce que j'voulais mais je ne vois pas trop le lien entre l'editorkit et mon document.
La seule fois où ils ont un lien est qd je veux enregistrer le fichier, je fais un: editorKit.write(outputstraeam, document, 0, document.lenght())
ceci engendre l'enregistrement de mon document dans mon fichier. Je pensais donc que ce qu'il fallait que je modifie pour mes tableaus était le document et non l'editorkit. Bref, je sais plus trop!!!
En ce qui concerne la possibilité qu'un JEditorPane soit mieux qu'un JTextPane, je n'y pense même pas! Je fini mon stage demain donc je ne vais pas tout reprogrammer!
En conclusion, je ne sais plus quoi faire avec ces tableaux! et tu as raison, mon insertString() mémorise que du plain text hélas
les nouvelles sont donc que j'en suis toujours au même point et qu'il faut que j'étudie rtfeditorkit!
merci de ton aide
Marsh Posté le 15-06-2006 à 11:45:15
Oui je crains que ça va être un peu chaud d'ici demain, mais hey, c les vacances alors ???
veinarde !!
Et oui je crains que l'éditorkit, tu as pas trop le choix.
Essaye de chercher des exemples d'implémentation, ce que tu cherches doit pas être très éloigné du RTFEditorKit.
Sinon repose une question sur le forum.
Je suis désolé ça dépasse mes connaissances ( et je dois qd m travailler un peu aussi )
Marsh Posté le 15-06-2006 à 17:03:16
oui c'est les vacances mais aussitôt recherche d'emploi!!
après quelques recherches, je ne pense pas qu'il faille modifier le rtfeditorkit mais plutot le document. je pense que c'est le document qui mémorise tout... enfin j'en sais rien...
bon courage pour ton 'travail'! et encore merci pour tes reponses!
Marsh Posté le 15-06-2006 à 17:31:02
Bof recherche d'emploi, ne sois pas trop pressée ... Mon conseil: ce sont tes dernières VRAIES vacances, alors profites-en.
Désolé de pas avoir pu aidé plus que ça.
Marsh Posté le 12-06-2006 à 09:22:55
Bonjour,
j'ai un objet de type StyledDocument et j'aimerai en faire une copie. Je précise : je ne souhaite pas avoir une référence sur mon objet mais bien un autre objet identique.
DefaultStyledDocument doc;
StyleContext context;
context = new StyleContext();
doc = new DefaultStyledDocument(context);
DefaultStyledDocument copieDoc /*= new DefaultStyledDocument(context)*/;//j'ai essayé avec et sans
copieDoc = doc;
Si je modifie la copie, c'est l'original qui est modifié.Si quelqu'un a une idée, n'hésitez pas!
Merci d'avance