我有一個JEditorPane
顯示以編程方式生成的HTML(在運行時)。 到目前爲止,當我添加一個「行」時,我在字符串緩衝區中重新創建了整個HTML文本,然後將它傳遞給JEditorPane.setText
方法。Java HTMLDocument(insertAfterEnd,insertAfterStart,insertBeforeEnd,insertBeforeStart)不起作用?
現在創建的HTML已經變得相當大(可以達到幾MB),我只需在最後添加我的新行而不是重新生成所有HTML文本。
我試圖在最後追加的原因是爲了避免Swing(或套件?)不得不再次渲染/解析整個文本。因爲即使HTML生成不是在EDT中執行,而是在另一個擺動工作線程中執行,「渲染」也需要很長時間。或者最好的辦法是有一個進度條顯示渲染的進度,這是不可能的(是嗎?)。
所以我的想法是簡單地追加到最後,但如果您有更好的主意,那麼歡迎!
由於我的文本在HTML表格中格式化,所以我想在此表的末尾添加我的新文本。爲此,我嘗試使用HTMLDocument
的insertBeforeEnd
,但即使嘗試了大量解決方案,我也無法使其工作。請注意,我只有「表格」標籤。
下面是我的一些代碼的一部分現在
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())
appening一些文字給「表「
現在
//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
即使everyhting與@JoopEggen的答案工作正常,字體渲染是不一樣的,我不明白爲什麼。在我看來,另一個問題是我在另一個問題(上面給出的鏈接)中提出了另一個問題。但在我的情況下,這是一個後續行動。
由於有些人可能會面臨同樣的問題,我設置這個編輯指向你相應的線程。
+1 setText()實際上可以重新創建文檔實例。檢查getDocument()是否返回相同的。如果不使用最新的文檔實例。 – StanislavL
感謝你們倆。我也理解你的建議,即JTextPane比JEditorPane更「高級」。我這樣說是因爲在你的解釋中,我刪除了「jep.setDocument(doc)」,並添加了「doc =(HTMLDocument)jep.getDocument();」 setText之後,一切工作正常。非常感謝你。不過,我需要更多的信息。我需要一個非常快速的應用程序,這就是爲什麼我使用JEditorPane而不是JTextPane,因爲據我所知,JEditorPane與JTextPane相比具有更少的「開銷」。您是否同意或者我應該切換到JTextPane(更「高級」)? – HpTerm
(對不起,延遲迴復。)沒有經驗。我沒有找到結構良好的源代碼。儘管從Java開始就不會抱怨這種複雜性:編輯HTML等等。 –