HTMLDocument Java (insertAfterEnd, insertAfterStart, insertBeforeEnd, insertBeforeStart) не работает? - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть JEditorPane, который отображает HTML, который генерируется программно (во время выполнения).До этого, когда я добавлял «строку», я заново создавал весь текст HTML в строковом буфере, а затем передавал его методу JEditorPane.setText.

Теперь созданный HTML-код стал довольно большим (можетдо нескольких МБ), и я просто добавил бы новую строку в конце, а не заново генерировал весь текст HTML.

Причина, по которой я пытаюсь добавить в конце, состоит в том, чтобы избегать Swing (илиКит?) необходимость рендеринга / анализа всего текста снова.Потому что, хотя генерация HTML выполняется не в EDT, а в другом потоке свингера, «рендеринг» занимает много времени.Или лучше было бы иметь индикатор выполнения, отображающий прогресс рендеринга, что невозможно (не так ли?).

Так что моя идея - просто добавить в конце, но если у вас есть лучшеИдея, это приветствуется!

Поскольку мой текст отформатирован в HTML-таблице, я хотел бы добавить свой новый текст в конец этой таблицы.Для этого я попытался использовать insertBeforeEnd из HTMLDocument, но мне не удалось заставить его работать, хотя я пробовал множество решений.Обратите внимание, что у меня есть только тег «table».

Вот некоторая часть моего кода

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-different-rendering-how-why

Несмотря на всехорошо работает с ответом @JoopEggen, рендеринг шрифтов не то же самое, и я не понимаю, почему.Поскольку мне кажется, что другая проблема, которую я написал здесь, я задал в другом вопросе (ссылка приведена выше).Но в моем случае это что-то вроде продолжения этого.

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

1 Ответ

7 голосов
/ 21 ноября 2011
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 с " H ello !!! ".

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

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

...