Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTMLDocument(insertAfterEnd、insertAfterStart、insertBeforeEnd、insertBeforeStart)不工作?_Java_Swing_Jtextpane_Jeditorpane_Dom - Fatal编程技术网

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();