2009-11-08 6 views
2

J'essaye de créer un éditeur WYSIWYG en utilisant JTextPane. J'utilise DefaultEditorKit.CopyAction pour copier du texte dans l'éditeur. Mais cette méthode ne conserve pas le style du texte. Quelqu'un peut-il me dire comment copier le texte dans JTextPane et préserver le style, s'il vous plaît?Comment copier du texte stylé dans JTextPane

Répondre

0

L'éditeur de livres Manning offre un téléchargement gratuit de la première édition de "Swing" par Matthew Robinson et Pavel Vorobiev au http://www.manning.com/robinson2. (Faites défiler vers le bas de la page à la recherche du lien «Télécharger le livre d'échange complet (MS Word 97)».)

Le chapitre 20 traite du développement d'un éditeur RTF WYSIWYG en utilisant un JTextPane comme composant du composant d'édition. La nouvelle version du livre est révisée et décrit la création d'un éditeur HTML WYSIWYG, mais ce n'est pas gratuit. (Malgré ce que dit la page sur le lien, la copie papier de la nouvelle édition ne semble pas être disponible, mais le livre électronique est, si cela vous intéresse.)

C'était une excellente ressource pour moi quand j'étais essayer de faire quelque chose de similaire.

+0

Exemple dans la première édition « effectuer des opérations de presse-papiers en utilisant le texte brut sans aucun attribut ». Le but de la question est de le faire de manière stylée. –

1

J'ai une classe qui utilise le code suivant pour copier tout le texte du StyledDocument dans le presse-papiers de l'utilisateur; il semble préserver des attributs comme la couleur, le gras et le soulignement (ne l'a pas testé avec autre chose). Notez que "this.doc" est un StyledDocument.

Aucune garantie que c'est la meilleure méthode.

try 
    { 
     Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     RTFEditorKit rtfek = new RTFEditorKit(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     rtfek.write(baos, this.doc, 0, this.doc.getLength()); 
     baos.flush(); 
     DataHandler dh = new DataHandler(baos.toByteArray(), rtfek.getContentType()); 
     clpbrd.setContents(dh, null); 
    } 
    catch (IOException | BadLocationException e) 
    { 
     e.printStackTrace(); 
    } 

Si vous souhaitez copier uniquement une sous-section du document, je pense que vous souhaitez modifier cette ligne:

rtfek.write(baos, this.doc, int startPosition, int endPosition) 

Edit: Il se trouve que celui créé RTFEditorKit a décidé qu'ils ne ont pas besoin adhérer à leur API. Essentiellement, startPosition et endPosition ci-dessus n'ont aucun effet.

/** 
* Write content from a document to the given stream 
* in a format appropriate for this kind of content handler. 
* 
* @param out The stream to write to 
* @param doc The source for the write. 
* @param pos The location in the document to fetch the 
* content. 
* @param len The amount to write out. 
* @exception IOException on any I/O error 
* @exception BadLocationException if pos represents an invalid 
* location within the document. 
*/ 
public void write(OutputStream out, Document doc, int pos, int len) 
    throws IOException, BadLocationException { 

     // PENDING(prinz) this needs to be fixed to 
     // use the given document range. 
     RTFGenerator.writeDocument(doc, out); 
} 
0

Essayez d'utiliser sérialisation. Quelque chose comme

public static DefaultStyledDocument cloneStyledDoc(DefaultStyledDocument source) { 
    try { 
     DefaultStyledDocument retDoc = new DefaultStyledDocument();  

     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(source); // write object to byte stream 

     ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());    
     ObjectInputStream ois = new ObjectInputStream(bis); 
     retDoc = (DefaultStyledDocument) ois.readObject(); //read object from stream 
     ois.close();   
     return retDoc; 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null;   
} 

espionnés Cay Horstmann`s livre http://horstmann.com/corejava.html

Questions connexes