загрузить RTF в JTextPane

Я создал класс типа JTextPane в своей программе текстового редактора. у него есть подкласс текста и форматированного текста, который наследуется от моего основного класса JTextPaneClass. Однако я не могу загрузить RTF в свой форматированный текст, потому что метод чтения потока ввода файла не находится в суперклассе JTextPane. Итак, как мне прочитать форматированный текст в jtextpane? Это кажется очень простым, я должен что-то упустить. Я вижу много примеров использования RTFEditorKit и заполнения JTextPane, но не тогда, когда он создается как класс.

public class RichTextEditor extends TextEditorPane {

private final String extension = ".rtf";
private final String filetype = "text/richtext";

public RichTextEditor() {
    // super( null, "", "Untitled", null );
    super();
    // this.setContentType( "text/richtext" );
}

/**
 * Constructor for tabs with content.
 * 
 * @param stream
 * @param path
 * @param fileName
 * @param color
 */
public RichTextEditor( FileInputStream stream, String path, String fileName, Color color, boolean saveEligible ) {
    super( path, fileName, color, saveEligible );
    super.getScrollableTracksViewportWidth();
    //RTFEditorKit rtf = new RTFEditorKit();
    //this.setEditorKit( rtf );
    setEditor();
    this.read(stream, this.getDocument(), 0);
    //this.read( stream, "RTFEditorKit" );
    this.getDocument().putProperty( "file name", fileName );
}



private void setEditor() {
    this.setEditorKit( new RTFEditorKit() );

}

линия:

this.read(stream, this.getDocument(), 0);

говорит мне

Метод read(InputStream, Document) в типе JEditorPane неприменим для аргументов (FileInputStream, Document, int)


person KiloJKilo    schedule 08.04.2015    source источник
comment
Что делает этот 0?   -  person RealSkeptic    schedule 08.04.2015
comment
pos Место в документе для размещения содержимого.   -  person KiloJKilo    schedule 08.04.2015
comment
Но откуда вы взяли такое определение read? Это точно не из JEditorPane. И ты его не преодолел. Как вы думаете, почему у него должен быть метод с тремя параметрами с именем read()?   -  person RealSkeptic    schedule 08.04.2015
comment
это от javax.swing.text.rtf.RTFEditorKit.read   -  person KiloJKilo    schedule 08.04.2015
comment
Правильно... так что вы не можете ожидать, что this.read() узнает об этом, так как это не расширяет RTFEditorKit. По сути, вы должны установить комплект редактора и использовать read объекта комплекта редактора, если это то, что вы хотели.   -  person RealSkeptic    schedule 08.04.2015
comment
Да, это то, что я хочу. this.setEditorKit( new RTFEditorKit() ); вызывается. Итак, как мне получить доступ к методу чтения объекта набора редактора?   -  person KiloJKilo    schedule 08.04.2015


Ответы (2)


Чтобы получить доступ к вашему комплекту редактора, вы должны сохранить ссылку на него. На самом деле имя вашего setEditor() метода setXXX, так что это должен быть сеттер (на самом деле, я не уверен, что вам нужно устанавливать его более одного раза, поэтому может быть, что этот метод вообще не должен существовать). Определите поле:

private RTFEditorKit kit = new RTFEditorKit();

Затем в конструкторе

setEditorKit( kit );
kit.read(...);

Если вы настаиваете на сохранении метода, его код должен быть

kit = new RTFEditorKit();
setEditorKit( kit );

И если вы используете это из конструктора, не забудьте изначально установить kit в void, чтобы не создавать лишний объект, который будет немедленно отброшен.

person RealSkeptic    schedule 08.04.2015

Я искал реализацию Java для загрузки документа RTF в JTextPane. Кроме этой темы ничего не нашел. Поэтому я опубликую здесь свое решение на случай, если оно поможет другим разработчикам:

            private static final RTFEditorKit RTF_KIT = new RTFEditorKit();
            (...)
            _txtHelp.setContentType("text/rtf");
            final InputStream inputStream = new FileInputStream(_helpFile);
            final DefaultStyledDocument styledDocument = new DefaultStyledDocument(new StyleContext());
            RTF_KIT.read(inputStream, styledDocument, 0);
            _txtHelp.setDocument(styledDocument);
person Michael Fayad    schedule 28.06.2016