我正在制作一个java聊天应用程序。我已经做了基础知识,&它的工作正常。现在我想添加更改字体和功能的功能。插入表情符号。我还想在每条消息旁边添加一个时间戳。
对于时间戳,很明显我们需要使用表来进行良好的对齐。但找不到一个简单的解决方案来拥有它们。经过一段时间的谷歌后,
CODE: 我创建了这些常规变量:
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument HTMLdoc = new HTMLDocument();
jTextPane1.setEditorKit(kit);
jTextPane1.setDocument(HTMLdoc);
在JButton中,我有以下代码来插入文本/聊天:
kit.insertHTML(HTMLdoc, HTMLdoc.getLength(), "<tr>"
+ "<td width=\"50\" valign=\"top\">NAME:</td>"
+ "<td width=\"250\"><font size=\"3\" face=\"Monospaced\">" + addSmiles(JOptionPane.showInputDialog(null)) + "</font></td>"
+ "<td width=\"100\" valign=\"top\"><font size=\"1\">"
+ new SimpleDateFormat("hh:mm a").format(Calendar.getInstance().getTime()).toString() + "</font></td>"
+ "</tr>", 0, 0, null);
addSmiles方法只会遍历每个单词,&amp;用img标签替换':)'。
为了保存/重新加载对话,我使用了这个基本代码:
kit.read(new FileReader("asd.htm"), HTMLdoc, 0);
kit.write(new FileWriter("asd.htm"), HTMLdoc, 0, HTMLdoc.getLength());
写得很好,但是读取会产生错误。
java.lang.RuntimeException: Must insert new content into body element
我觉得我错误地使用了insertHTML方法。有人能给我一个很好的链接,显示它的用法吗?特别是最后三个参数(pop&amp; pushDepth,insertTag)和示例。 Oracle文档,不解释它让我满意。 :/
我希望我能正确地解释我的问题&amp;不要太长! :D期待你的回答。
---------编辑:---------
我稍微更改了我的代码:
初始化:
HTMLEditorKit kit = new HTMLEditorKit();
jTextPane1.setEditorKit(kit);
HTMLDocument HTMLdoc = (HTMLDocument) jTextPane1.getDocument();
HTMLdoc.putProperty("IgnoreCharsetDirective", true);
我将初始行插入到doc中,并使用适当的try-catch:
kit.insertHTML(HTMLdoc, 0, "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">", 0, 0, null);
kit.insertHTML(HTMLdoc, HTMLdoc.getLength(), "<table id=\"TBL\"></table>", 0, 0, null);
任何聊天,我使用与以前相同的HTML字符串,只需更改用于插入的方法:
HTMLdoc.insertBeforeEnd(HTMLdoc.getElement("TBL"), "<tr>"
+ "<td width=\"50\" valign=\"top\">NAME:</td>"
+ "<td width=\"250\"><font size=\"3\" face=\"Monospaced\">" + addSmiles(JOptionPane.showInputDialog(null)) + "</font></td>"
+ "<td width=\"100\" valign=\"top\">" + new SimpleDateFormat("hh:mm a").format(Calendar.getInstance().getTime()).toString() + "</td>"
+ "</tr>");
最后,保存聊天:
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("asd"), "UTF-8");
kit.write(out, HTMLdoc, 0, HTMLdoc.getLength());
out.close();
在此之前,一切都很美妙。当我打开文件“asd”时,它会正确显示HTML。我甚至可以在浏览器中打开它。正确查看数据。
检索数据&amp;将其插回JTextPane / Document:
InputStreamReader in = new InputStreamReader(new FileInputStream("asd"), "UTF-8");
kit.read(in, HTMLdoc, 0);
in.close();
在这种情况下,我收到错误:
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Must insert new content into body element-
at javax.swing.text.html.HTMLDocument$HTMLReader.generateEndsSpecsForMidInsert(HTMLDocument.java:2353)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2300)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2174)
at javax.swing.text.html.HTMLDocument$HTMLReader.<init>(HTMLDocument.java:2169)
at javax.swing.text.html.HTMLDocument.getReader(HTMLDocument.java:326)
at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:260)
at ChatGUI.NewJFrame.jBtnRWActionPerformed(NewJFrame.java:157)
第157行指向kit.read语句。谁能告诉我这里做错了什么?
再次编辑------------------------
我意识到自己的错误:)。在阅读之前必须清除文档:
HTMLdoc.remove(0, HTMLdoc.getLength());
现在它有效!!
答案 0 :(得分:2)
在这里阅读Javadoc非常有帮助。
最好将表元素保存在某处。然后
// Assuming the table has attribute id="TBL":
Element tableElement = htmlDoc.getElement("TBL");
htmlDoc.insertBeforeEnd(tableElement, "<tr>...</tr>");
我的确建议使用可以缩短HTML的StyleSheet。
可能是HTML中的<style type="text/css">
(用于存储)。
笑脸也可以用图像完成; as alt 属性为“:)”。
最好使用Unicode,UTF-8,而不是当前的操作系统编码。
new InputStreamReader(new FileInputStream(file), "UTF-8")
new OutputStreamWriter(new FileOutputStream(file), "UTF-8")
使用文件中指定的编码:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">