2011-11-21 47 views
4

我有一個JEditorPane顯示以編程方式生成的HTML(在運行時)。 到目前爲止,當我添加一個「行」時,我在字符串緩衝區中重新創建了整個HTML文本,然後將它傳遞給JEditorPane.setText方法。Java HTMLDocument(insertAfterEnd,insertAfterStart,insertBeforeEnd,insertBeforeStart)不起作用?

現在創建的HTML已經變得相當大(可以達到幾MB),我只需在最後添加我的新行而不是重新生成所有HTML文本。

我試圖在最後追加的原因是爲了避免Swing(或套件?)不得不再次渲染/解析整個文本。因爲即使HTML生成不是在EDT中執行,而是在另一個擺動工作線程中執行,「渲染」也需要很長時間。或者最好的辦法是有一個進度條顯示渲染的進度,這是不可能的(是嗎?)。

所以我的想法是簡單地追加到最後,但如果您有更好的主意,那麼歡迎!

由於我的文本在HTML表格中格式化,所以我想在此表的末尾添加我的新文本。爲此,我嘗試使用HTMLDocumentinsertBeforeEnd,但即使嘗試了大量解決方案,我也無法使其工作。請注意,我只有「表格」標籤。

下面是我的一些代碼的一部分現在

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的答案工作正常,字體渲染是不一樣的,我不明白爲什麼。在我看來,另一個問題是我在另一個問題(上面給出的鏈接)中提出了另一個問題。但在我的情況下,這是一個後續行動。

由於有些人可能會面臨同樣的問題,我設置這個編輯指向你相應的線程。

回答

6
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,通過它你可以做更多。

其餘的是好的。

+1

+1 setText()實際上可以重新創建文檔實例。檢查getDocument()是否返回相同的。如果不使用最新的文檔實例。 – StanislavL

+1

感謝你們倆。我也理解你的建議,即JTextPane比JEditorPane更「高級」。我這樣說是因爲在你的解釋中,我刪除了「jep.setDocument(doc)」,並添加了「doc =(HTMLDocument)jep.getDocument();」 setText之後,一切工作正常。非常感謝你。不過,我需要更多的信息。我需要一個非常快速的應用程序,這就是爲什麼我使用JEditorPane而不是JTextPane,因爲據我所知,JEditorPane與JTextPane相比具有更少的「開銷」。您是否同意或者我應該切換到JTextPane(更「高級」)? – HpTerm

+0

(對不起,延遲迴復。)沒有經驗。我沒有找到結構良好的源代碼。儘管從Java開始就不會抱怨這種複雜性:編輯HTML等等。 –