Java HTMLDocument(insertAfterEnd、insertAfterStart、insertBeforeEnd、insertBeforeStart)不工作?
我有一个Java HTMLDocument(insertAfterEnd、insertAfterStart、insertBeforeEnd、insertBeforeStart)不工作?,java,swing,jtextpane,jeditorpane,dom,Java,Swing,Jtextpane,Jeditorpane,Dom,我有一个JEditorPane,它显示以编程方式(在运行时)生成的HTML。 到目前为止,当我添加“行”时,我正在字符串缓冲区中重新创建整个HTML文本,然后将其传递给JEditorPane.setText方法 现在创建的HTML变得相当大(可以达到几MB),我只需在末尾添加新行,而不是重新生成所有HTML文本 我尝试在结尾追加的原因是为了避免Swing(或工具包?)不得不再次呈现/解析整个文本。因为即使HTML生成不是在EDT中执行的,而是在另一个swingworker线程中执行的,“呈现”也
JEditorPane
,它显示以编程方式(在运行时)生成的HTML。
到目前为止,当我添加“行”时,我正在字符串缓冲区中重新创建整个HTML文本,然后将其传递给JEditorPane.setText
方法
现在创建的HTML变得相当大(可以达到几MB),我只需在末尾添加新行,而不是重新生成所有HTML文本
我尝试在结尾追加的原因是为了避免Swing(或工具包?)不得不再次呈现/解析整个文本。因为即使HTML生成不是在EDT中执行的,而是在另一个swingworker线程中执行的,“呈现”也需要很长时间。或者最好有一个进度条来显示渲染的进度,这是不可能的(是吗?)
因此,我的想法是简单地在结尾追加,但如果您有更好的想法,欢迎使用
由于我的文本是在HTML表格中格式化的,所以我想将我的新文本附加到此表格的末尾。为此,我尝试使用HTMLDocument
的insertbeforeed
,但即使我尝试了很多解决方案,也无法让它正常工作。请注意,我只有“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>");
请注意,元素似乎可以正确找到,因为System.out.println(e.getName())
给出了“table”
现在
编辑
我开始了一个新的问题,下面是链接:
尽管每个人都能很好地使用@JoopEggen的答案,但字体呈现却不一样,我不明白为什么。在我看来,这是一个不同的问题,我在另一个问题(上面给出的链接)中问了它。但在我的情况下,这是一个后续的问题
由于有些人可能会遇到同样的问题,我将此编辑设置为指向相应的线程;
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();
...
JTextPane jep=jTextPane1;
setContentType(“text/html”);
jep.setText(“一行文本另一行文本”);
doc=(HTMLDocument)jep.getStyledDocument();
后跟setText的内容类型将安装EditorKit并确定文档。出于这个原因,请在之后使用StyledDocument。setText(“…”)再次确保采用HTML。(您可以使用带有“Hello”的JLabel或JButton!!!”
JTextPane比JEditorPane(奇怪的命名)更高级。它提供了样式文档,您可以通过它做更多的工作
其余的都没问题。+1 setText()实际上可以重新创建文档实例。检查getDocument()是否返回相同的实例。如果没有,请使用最新的doc-ument实例。感谢你们两位。我也理解你们的建议,JTextPane比JEditorPane更“高级”。我这样说是因为在你们的解释中,我删除了“jep.setDocument(doc)”,我在setText之后添加了“doc=(HTMLDocument)jep.getDocument();”,一切正常。非常感谢。但是我需要一些进一步的信息。我需要一个非常快速的应用程序,这就是为什么我使用JEditorPane而不是JTextPane,因为据我所知,JEditorPane的“开销”更少“那是JTextPane。你同意吗?还是我应该切换到JTextPane(更“高级”)?(很抱歉反应太晚。)没有经验。我觉得源代码的结构不是很好。虽然人们可能不会抱怨从Java一开始就有这么复杂:编辑HTML等等。非常感谢。这篇文章节省了时间。在过去的三天里,我一直在努力解决同样的问题。我通过setText()重新设置文档模型,但通过先前对getDocument()的调用对该文档进行了过时的引用。在setText()成功后,删除getDocument()并将其替换为getStyledDocument()!
//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)
...
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();