有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing Java聊天应用程序出现多字体、插入笑脸和表格的问题

我正在制作一个java聊天应用程序。我已经做好了基本的准备;很好用。现在我想添加更改字体的功能&;插入微笑。我还想在每条信息旁边加上一个小时间戳

对于时间戳,很明显,我们需要使用表格进行良好的对齐。但却找不到一个简单的解决办法。在谷歌搜索了一下之后

  • 我知道它可以通过HTML实现。所以我尝试了HTML编辑器工具包&;效果很好。微笑、字体和;时间被插入。
    • 但是,我还需要将聊天对话保存到文件中(用于聊天历史记录)。我知道这一切背后有一份文件。我尝试使用它的方法来保存/加载,但遇到了一些问题。代码如下
    • 此外,字体大小也是一个问题,因为它的范围是1-7&;我想要MS Word中的正常范围
    • 最后,我的HTML知识非常基础,这些天,HTML与CCS一起使用,而我对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)和示例。甲骨文医生,别解释得让我满意/

  • 我使用了SimpleAttributeSet的标准StyledDocuemnt来支持多种字体。我使用了RTFEditorKit&;已成功保存/加载聊天记录。但无法插入笑脸或时间戳表。我确实遇到了一个链接here。它试图在JTextPane中绘制表格。我觉得很难理解,但如果你们推荐的话,我会认真研究的

我希望我能体面地解释我的问题;不要太长!:我期待着你的回答

-----------编辑:------------

我稍微修改了代码:

初始化:

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字符串,只是更改了用于插入的方法:

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/文档:

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行指向工具包。阅读声明。有人能告诉我我做错了什么吗

再次编辑-------------------

我意识到我的错误:)。在阅读之前,必须清除文件: HTMLdoc.remove(0, HTMLdoc.getLength()); 现在它成功了


共 (1) 个答案

  1. # 1 楼答案

    在这里,阅读Javadoc非常有帮助

    最好将table元素放在某个地方。然后

    // Assuming the table has attribute id="TBL":
    Element tableElement = htmlDoc.getElement("TBL");
    htmlDoc.insertBeforeEnd(tableElement, "<tr>...</tr>");
    

    我确实建议使用可以缩短HTML的样式表。 可能是HTML中的<style type="text/css">(用于存储)

    笑脸也可以通过图像来实现;作为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">