Java聊天应用程序 - 麻烦多种字体,插入表情符号&表

时间:2013-03-15 13:55:16

标签: java swing jtextpane htmleditorkit

我正在制作一个java聊天应用程序。我已经做了基础知识,&它的工作正常。现在我想添加更改字体和功能的功能。插入表情符号。我还想在每条消息旁边添加一个时间戳。

对于时间戳,很明显我们需要使用表来进行良好的对齐。但找不到一个简单的解决方案来拥有它们。经过一段时间的谷歌后,

  • 我了解到可以使用HTML实现。所以我尝试了HTML编辑器套件&它工作得很好。表情符号,字体&插入时间。
    • 但是,我还要求将该聊天对话保存到文件中(用于聊天历史记录)。我知道这背后有一份文件。我尝试使用它的方法来保存/加载,但有一些问题。代码如下。
    • 另外字体大小是一个问题,因为它的范围是1-7&我希望像MS Word一样有正常的范围。
    • 最后,我的HTML知识非常基础,而且现在,HTML与CCS一起使用,我不知道。大多数网站都不鼓励使用HTML标签,因为最新版本甚至不支持它们。这会给我的应用程序带来问题吗?如果是这样,我想要另一种方法来实现上述目标 - 即使这是一个简单的大学项目,也不想使用弃用的东西。

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文档,不解释它让我满意。 :/

  • 我使用标准的StyledDocuemnt和SimpleAttributeSet来支持多种字体。我使用了RTFEditorKit&amp;成功保存/加载聊天。但无法插入表情符号,也无法插入时间戳表。我确实遇到了一个链接here。它试图将表绘制到JTextPane中。发现它很难理解,但如果你们推荐它,那么我会认真研究它。

我希望我能正确地解释我的问题&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()); 现在它有效!!

1 个答案:

答案 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">