Java HTMLDocument (insertAfterEnd, insertAfterStart, insertBeforeEnd, insertBeforeStart) не работает?

У меня есть 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 все работает нормально, рендеринг шрифта отличается, и я не понимаю, почему. Как мне кажется, это другая проблема, чем та, что размещена здесь, я задал ее в другом вопросе (ссылка приведена выше). Но в моем случае это своего рода продолжение этого.

Поскольку некоторые могут столкнуться с той же проблемой, я установил этот РЕДАКТИРОВАТЬ, чтобы указать вам на соответствующий поток.


person HpTerm    schedule 21.11.2011    source источник


Ответы (1)


private HTMLDocument doc;
...
JTextPane jep = jTextPane1;
jep.setContentType("text/html");
jep.setText("<html><table><tr><td>A line of text</td></tr><tr><td>Another line of text</td></tr></table>");
doc = (HTMLDocument)jep.getStyledDocument();

Тип содержимого, за которым следует setText, устанавливает EditorKit и определяет документ. По этой причине возьмите StyledDocument позже. setText("...") снова гарантирует, что HTML будет взят. (У вас может быть JLabel или JButton с "‹ html >‹ b >H‹ /b >‹ i >ello‹ /i >‹ span style='color: #0ff078' >!!!‹ /span >".

JTextPane более высокого уровня, чем JEditorPane (странное название). Он предоставляет StyledDocument, с помощью которого вы могли бы сделать больше.

Остальное в порядке.

person Joop Eggen    schedule 21.11.2011
comment
+1 setText() на самом деле может воссоздать экземпляр документа. Проверьте, возвращает ли getDocument() тот же самый. Если нет, используйте последний экземпляр документа. - person StanislavL; 22.11.2011
comment
Спасибо вам обоим. Я также понимаю ваш совет, что JTextPane более высокого уровня, чем JEditorPane. Я говорю это, потому что с вашими объяснениями я удалил jep.setDocument(doc) и добавил doc = (HTMLDocument)jep.getDocument(); ПОСЛЕ setText и все работает нормально. Спасибо большое. Однако мне нужно немного дополнительной информации. Мне нужно очень-очень быстрое приложение, поэтому я использовал JEditorPane вместо JTextPane, потому что, насколько я понимаю, JEditorPane имеет меньше накладных расходов, чем JTextPane. Вы согласны с этим или мне переключиться на JTextPane (более высокий уровень)? - person HpTerm; 23.11.2011
comment
(Извините за поздний ответ.) Нет опыта. Я не нахожу исходный код очень хорошо структурированным. Хотя на такую ​​сложность с самого начала Java можно не жаловаться: редактирование HTML и прочее. - person Joop Eggen; 30.11.2011
comment
Спасибо большое. Этот пост сэкономил время. В течение последних трех дней я боролся с той же проблемой. Я переустанавливал модель документа через setText(), но имел устаревшую ссылку на документ через более ранний вызов getDocument(). Удаление getDocument() и замена его на getStyledDocument() после setText() сделали свое дело! - person user396089; 22.12.2011