我正在尝试使用JTextPane创建一个WYSIWYG编辑器。
我正在使用DefaultEditorKit.CopyAction在编辑器中复制文本。但是这种方法不保留文本的样式。有人能告诉我如何在JTextPane中复制文本并保留样式吗?
答案 0 :(得分:3)
http://java-sl.com/tip_merge_documents.html 你可以用它。如果您需要文档的一部分,只需选择源窗格的所需片段。
答案 1 :(得分:1)
我有一个类使用以下代码将StyledDocument中的所有文本复制到用户的剪贴板中;它似乎保留了颜色,粗体和下划线等属性(没有用其他任何东西测试它)。请注意,“this.doc”是StyledDocument。
不保证这是最好的方法。
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();
}
如果您只想复制文档的一个子部分,我想您想要修改这一行:
rtfek.write( baos, this.doc, int startPosition, int endPosition )
编辑:事实证明,创建RTFEditorKit的人决定他们不需要遵守他们的API。基本上上面的startPosition和endPosition都没有效果。
/**
* 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);
}
答案 2 :(得分:0)
图书出版商Manning在http://www.manning.com/robinson2免费下载Matthew Robinson和Pavel Vorobiev的第一版“Swing”。 (向下滚动页面,查找链接“下载完整的Swing Book(MS Word 97)。”)
第20章讨论了使用JTextPane
作为编辑组件的一部分来开发WYSIWYG RTF编辑器。本书的新版本已经过修订,并描述了WYSIWYG HTML编辑器的创建,但它并不是免费的。 (尽管链接上的页面显示,新版本的纸质副本似乎不可用,但如果您感兴趣,则电子书是。)
当我尝试做类似的事情时,这对我来说是一个很好的资源。
答案 3 :(得分:0)
尝试使用序列化。 像
这样的东西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;
}
发现了Cay Horstmann的书http://horstmann.com/corejava.html