Java HTMLDocument(insertAfterEnd,insertAfterStart,insertBeforeEnd,insertBeforeStart)无法正常工作?

HpT*_*erm 5 java swing dom jtextpane jeditorpane

我有一个JEditorPane显示以编程方式生成的HTML(在运行时).到目前为止,当我添加"行"时,我在字符串缓冲区中重新创建整个HTML文本,然后将其传递给JEditorPane.setText方法.

现在创建的HTML变得非常大(可以达到几MB),我只想在最后添加我的新行,而不是重新生成所有HTML文本.

我试图在最后追加的原因是为了避免Swing(或套件?)必须再次渲染/解析整个文本.因为即使HTML生成不是在EDT中执行,而是在另一个swingworker线程中执行,"渲染"也需要很长时间.或者最好的是有一个显示渲染进度的进度条,这是不可能的(是吗?).

所以我的想法是简单地追加到最后,但如果你有更好的想法,欢迎!

由于我的文本是在HTML表格中格式化的,我想在此表的末尾附加我的新文本.为此,我尝试使用它insertBeforeEnd,HTMLDocument但即使我尝试了大量的解决方案,我也无法使它工作.请注意,我只有"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>");
Run Code Online (Sandbox Code Playgroud)

现在在这个表的末尾添加一些文本

//getting the Table Element
Element e = doc.getElement(doc.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.TABLE);
Run Code Online (Sandbox Code Playgroud)

请注意,该元素似乎正确找到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);
    }
Run Code Online (Sandbox Code Playgroud)

提出异常:

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)
...
Run Code Online (Sandbox Code Playgroud)

编辑

我已经开始了一个关于这个跟进的新问题,这里是链接:

/sf/ask/676144661/

即使每个人都在使用@JoopEggen的答案工作正常,字体渲染也不一样,我不明白为什么.在我看来,在这里发布的另一个问题是我在另一个问题(上面给出的链接)中提出的问题.但在我的情况下,这有点跟进这个.

由于有些人可能会面临同样的问题,因此我将此EDIT设置为指向相应的线程.

Joo*_*gen 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();
Run Code Online (Sandbox Code Playgroud)

内容类型后跟setText安装EditorKit并确定文档.因此,请在之后使用StyledDocument.setText("...")再次确保获取HTML.(您可以使用"<html> <b> H </ b> <i> ello </ i> <span style ='color:#0ff078'> !!! </ span>"的JLabel或JButton.

JTextPane的级别更高,如JEditorPane(奇怪的命名).它提供了StyledDocument,您可以通过它执行更多操作.

剩下的还可以.