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)
编辑
我已经开始了一个关于这个跟进的新问题,这里是链接:
即使每个人都在使用@JoopEggen的答案工作正常,字体渲染也不一样,我不明白为什么.在我看来,在这里发布的另一个问题是我在另一个问题(上面给出的链接)中提出的问题.但在我的情况下,这有点跟进这个.
由于有些人可能会面临同样的问题,因此我将此EDIT设置为指向相应的线程.
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,您可以通过它执行更多操作.
剩下的还可以.
归档时间: |
|
查看次数: |
2818 次 |
最近记录: |