Как скопировать стилизованный текст в JTextPane

Я пытаюсь создать редактор WYSIWYG, используя JTextPane.

Я использую DefaultEditorKit.CopyAction для копирования текста в редакторе. Но этот метод не сохраняет стиль текста. Может кто-нибудь сказать мне, как скопировать текст в JTextPane и сохранить стиль, пожалуйста?


person Kien Truong    schedule 08.11.2009    source источник


Ответы (4)


http://java-sl.com/tip_merge_documents.html Вы можете использовать это. Если вам нужна часть документа, просто выберите нужный фрагмент исходной панели.

person StanislavL    schedule 31.10.2010

У меня есть класс, который использует следующий код для копирования всего текста из 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);
}
person ManEatingCheese    schedule 15.06.2013

Книжное издательство Manning предлагает бесплатно скачать первое издание «Качелей» Мэтью Робинсона и Павла Воробьева по адресу http://www.manning.com/robinson2/. (Прокрутите страницу вниз в поисках ссылки «Загрузить полную книгу Swing (MS Word 97)».)

В главе 20 рассказывается о разработке WYSIWYG-редактора RTF с использованием JTextPane как части компонента редактирования. Новая версия книги переработана и описывает создание HTML-редактора WYSIWYG, но она платная. (Несмотря на то, что написано на странице по ссылке, бумажная копия нового издания, похоже, недоступна, но электронная книга доступна, если вам интересно.)

Это был отличный ресурс для меня, когда я пытался сделать что-то подобное.

person clartaq    schedule 09.11.2009
comment
Пример в первой редакции выполнения операций с буфером обмена с использованием простого текста без каких-либо атрибутов. Суть вопроса в том, чтобы сделать это стильно. - person Aleksey Otrubennikov; 25.04.2013

Попробуйте использовать сериализацию. Что-то типа

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;        
}

Подсмотрел книгу Кея Хорстманна http://horstmann.com/corejava.html

person Paul Scvortsov    schedule 27.10.2016