我正在制作一个 java 聊天应用程序。我已经做了基础知识,并且工作正常。现在我想添加更改字体和插入表情符号的功能。我还想在每条消息旁边添加一个小时间戳。
对于时间戳,很明显我们需要使用表格进行良好的对齐。但是找不到一个简单的解决方案来拥有它们。google了一下之后,
- 我了解到它可以使用 HTML 来实现。所以我尝试了 HTML Editor Kit,效果很好。表情符号、字体和时间已插入。
- 但是,我还需要将该聊天对话保存到文件中(用于聊天历史记录)。我知道这一切背后都有一份文件。我尝试使用它的方法来保存/加载,但遇到了一些问题。代码如下。
- 此外,字体大小是一个问题,因为它的范围是 1-7 并且我希望拥有像 MS Word 中的正常范围。
- 最后,我的 HTML 知识非常基础,现在 HTML 与 CCS 一起使用,我对此一无所知。大多数网站不鼓励使用 HTML 标签,因为最新版本甚至不支持它们。这会给我的应用程序带来问题吗?如果是这样,我想要另一种方法来实现上述目标 - 即使这是一个简单的大学项目,也不想使用已弃用的东西。
代码:我创建了这些通用变量:
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 方法只是遍历每个单词,并用 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 & pushDepth、insertTag)的例子。Oracle 文档,请不要让我满意地解释它。:/
- 我使用了带有 SimpleAttributeSet 的标准 StyledDocuemnt 来支持多种字体。我使用了 RTFEditorKit 并成功保存/加载了聊天。但无法插入表情符号或时间戳表。我确实在这里遇到了一个链接。它尝试将表格绘制到 JTextPane 中。发现很难理解,但如果你们推荐它,那么我会认真研究它。
我希望我能体面地解释我的问题,而不是太冗长!:D 期待您的回答。
- - - - -编辑 : - - - - -
我稍微改变了我的代码:
初始化:
HTMLEditorKit kit = new HTMLEditorKit();
jTextPane1.setEditorKit(kit);
HTMLDocument HTMLdoc = (HTMLDocument) jTextPane1.getDocument();
HTMLdoc.putProperty("IgnoreCharsetDirective", true);
我将初始行插入到文档中,并带有适当的 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 String,只是改了用来插入的方法:
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。我什至可以在浏览器中打开它并正确查看数据。
要检索数据并将其重新插入 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());
现在它可以工作了!