У меня есть JEditorPane
, который отображает HTML, сгенерированный программно (во время выполнения). До сих пор, когда я добавлял «строку», я воссоздавал весь текст HTML в строковом буфере, а затем передавал его методу JEditorPane.setText
.
Теперь созданный HTML-код стал довольно большим (может достигать нескольких МБ), и я бы просто добавил свою новую строку в конец вместо повторного создания всего текста HTML.
Причина, по которой я пытаюсь добавить в конец, состоит в том, чтобы избежать повторного рендеринга/анализа всего текста Swing (или комплекта?). Потому что, хотя генерация HTML выполняется не в EDT, а в другом потоке Swingworker, «рендеринг» занимает много времени. Или лучше всего иметь индикатор выполнения, отображающий прогресс рендеринга, что невозможно (не так ли?).
Итак, моя идея состоит в том, чтобы просто добавить в конец, но если у вас есть идея получше, это приветствуется!
Поскольку мой текст отформатирован в таблице HTML, я хотел бы добавить свой новый текст в конец этой таблицы. Для этого я пытался использовать insertBeforeEnd
из HTMLDocument
, но мне не удалось заставить его работать, хотя я перепробовал множество решений. Обратите внимание, что у меня есть только тег «таблица».
Вот часть моего кода
JEditorPane jep = new JEditorPane();
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = new HTMLDocument();
jep.setEditorKit(kit);
jep.setDocument(doc);
//setting dummy text within a HTML table
jep.setText("<table><tr><td>A line of text</td></tr><tr><td>Another line of text</td></tr></table>");
Теперь для добавления текста в конце этой таблицы
//getting the Table Element
Element e = doc.getElement(doc.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.TABLE);
Обратите внимание, что элемент найден правильно, так как System.out.println(e.getName())
дает "таблицу"
Сейчас
//inserting text at the end of the table
try {
doc.insertBeforeEnd(e, "<tr><td>A New Line</td></tr>");
} catch (BadLocationException ex) {
System.out.println(ex);
} catch (IOException ex) {
System.out.println(ex);
}
Вызывает у меня исключение:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: No HTMLEditorKit.Parser
at javax.swing.text.html.HTMLDocument.verifyParser(HTMLDocument.java:1500)
at javax.swing.text.html.HTMLDocument.insertBeforeEnd(HTMLDocument.java:1248)
...
ИЗМЕНИТЬ
Я начал новый вопрос о продолжении этого, вот ссылка:
https://stackoverflow.com/questions/9659209/jeditorpane-htmldocument-other-rendering-how-why
Несмотря на то, что с ответом @JoopEggen все работает нормально, рендеринг шрифта отличается, и я не понимаю, почему. Как мне кажется, это другая проблема, чем та, что размещена здесь, я задал ее в другом вопросе (ссылка приведена выше). Но в моем случае это своего рода продолжение этого.
Поскольку некоторые могут столкнуться с той же проблемой, я установил этот РЕДАКТИРОВАТЬ, чтобы указать вам на соответствующий поток.