我有一个JEditorPane
,它显示以编程方式生成的HTML(在运行时)。
到目前为止,当我添加"线"我在字符串缓冲区中重新创建整个HTML文本,然后将其传递给JEditorPane.setText
方法。
现在创建的HTML变得非常大(最多可以达到几MB),我只想在最后添加新行,而不是重新生成所有HTML文本。
我试图在最后追加的原因是为了避免Swing(或套件?)必须再次渲染/解析整个文本。因为即使HTML生成不是在EDT中执行,而是在另一个swingworker线程中执行,"渲染"需要很长时间或者最好的是有一个显示渲染进度的进度条,这是不可能的(是吗?)。
所以我的想法是简单地追加到最后,但如果你有更好的想法,欢迎它!
由于我的文本是在HTML表格中格式化的,我想在此表的末尾添加我的新文本。为此,我尝试使用insertBeforeEnd
的{{1}},但即使我尝试了大量解决方案,我也无法让它工作。请注意,我只有" table"标签
以下是我的代码的一部分
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);
给出&#34; table&#34;
现在
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);
}
修改
我已经开始了关于此问题后续行动的新问题,这里是链接:
https://stackoverflow.com/questions/9659209/jeditorpane-htmldocument-different-rendering-how-why
即使每个人都在使用@JoopEggen的答案工作正常,但字体渲染并不相同,我也不明白为什么。在我看来,在这里发布的另一个问题是我在另一个问题(上面给出的链接)中提出的问题。但在我的情况下,这有点跟进了这个。
由于有些人可能会面临同样的问题,因此我将此EDIT设置为指向相应的主题。
答案 0 :(得分:7)
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,其中包含“&lt; html&gt;&lt; b&gt; H&lt; / b&gt;&lt; i&gt; ello&lt; / i&gt;&lt; span style ='color:#0ff078'&gt; !!!&lt; / span&gt;“。
JTextPane是更高级别的JEditorPane(奇怪的命名)。它提供了StyledDocument,您可以通过它来完成更多工作。
其余的都没问题。