java swing 聊天表情功能的实现(带完整代码) | 您所在的位置:网站首页 › 制作表情包的字体软件 › java swing 聊天表情功能的实现(带完整代码) |
下载地址:https://gitee.com/zoyation/pic-chat 前言: 用java swing做聊天程序,可能是没事找事,也可能是大才小用,既然选择了就做吧 其中比较重要的功能可能就是是聊天表情了,当然字体也重要 经过多天来的资料查找和实践,终于做出来了,方法不是很先进,但是运行效果良好下面是总结出的一个示例 主要功能: 1.聊天表情框的显示, 2.聊天信息(文本信息、字体信息、表情信息、用户)的传输udp, 3.聊天信息的显示(表情和文本混合显示), 4.震动, 5.悬浮提示框难点1:表情框 难点2:表情(信息)的显示和传输 难点3:表情和文本的混合 难点4:字体属性的设置和传输 解决方案 一、表情框使用javax.swing.JWindow类(无修饰的窗体类),继承这个类可以实现,在一个什么都没有的空窗体(没有标题栏,没有最大、最小化,没有关闭按钮等),我们可以设置其布局为网格布局setLayout(ew GridLayout(7,15) ),然后在每个格子里再加上图片(图片当然要先放在JLabel或JPanel里比较好,设置边框,添加鼠标监听)等 代码如下: 表情图片所在目录:com.zou.chat.component.qqdefaultface 下放105张表情图 名字为0.gif,1.gif——104.gif 注意目录结构:com.zou.chat.component.qqdefaultface 下面放图,com.zou.chat.component下放java文件,红色标注部分保证一致 PicsJWindow.java: /*自定义的ImageIcon的子类,在聊天窗体添加表情时,方便取出图片的描述信息*/ package com.zou.chat; import java.net.URL; import javax.swing.ImageIcon; public class ChatPic extends ImageIcon{ /** *图片描述 */ private static final long serialVersionUID = 1L; int im;//图片代号 public int getIm() { return im; } public void setIm(int im) { this.im = im; } public ChatPic(URL url,int im){ super(url); this.im = im; } } 二、三、四 :表情(信息)的显示和传输,表情和文本的混合 字体属性的设置和传输 显示表情通过 JTextPane的StyledDocument对象的添加图片功能实现,传输时不直接传图片,只传相对于文本的位置和代号,通过document取出表情的位置和代号,自定义封装规则(这样对方程序收到后就可以在按规则还原位置和代号,在指定位置显示图片),这样表情和文本就可以混合了,字体一样定义传输规则,比如消息串可以这样定义的 userinfo*font*message 用String.spilt()分离 userinfo代表 用户信息字符串表示,为了简单就代表用户名,当然其中不能包括*号,不然 把userinfo*font*message 根据*分离出来就不能取得正确的userinfo, font字体信息 font的可为内容为 fontname|fontsize|fontColor ”宋体| 10|1-1-1",可以继续取出fontname fontsize fontColor ,用其设置要插入的文字的格式 JTextPane的使用: JTextPane tp = new JTextPane(); StyledDocument doc = jp.getStyledDocument();//这个对象可以完成下列操作,很方便,实现图文混和显示 既可以插入文本和文本样式, SimpleAttributeSet attrSet;//参数需要 doc .insertString(doc .getLength(), "Hello,SytedDocument!\n",attrib.getAttrSet()); public SimpleAttributeSet getAttrSet() { attrSet = new SimpleAttributeSet(); StyleConstants.setFontFamily(attrSet, "宋体"); StyleConstants.setBold(attrSet, false); StyleConstants.setItalic(attrSet, false); StyleConstants.setFontSize(attrSet, size); StyleConstants.setForeground(attrSet, Color.RED); return attrSet; } 也可以插入图片, String fileName= "qqdefaultface/1.gif"; doc .insertIcon(new ImageIcon(PicsJWindow.class.getResource(fileName))); 还可以设置每次插入的文字位置, int pos = 0; // 位置0到 长度减1,不要越界 doc .setCaretPosition(pos); /*设置插入位置*/ doc .insertString(doc .getLength(), "Hello,SytedDocument!\n",attrib.getAttrSet()); 图片位置, doc .setCaretPosition(pos);/*设置插入位置*/ doc .insertIcon(new ImageIcon(PicsJWindow.class.getResource(fileName))); 也可以取出每次插入的文本和图片信息 String text = tp.getText();//取文本 //取图 private List myPicInfo = new LinkedList(); private String buildPicInfo(){ StringBuilder sb = new StringBuilder(""); //遍历jtextpane找出所有的图片信息封装成指定格式 for(int i = 0; i < this.jpMsg.getText().length(); i++){ if(docMsg.getCharacterElement(i).getName().equals("icon")){ //doc = (ChatPic) Icon icon = StyleConstants.getIcon(doc.getStyledDocument().getCharacterElement(i).getAttributes()); ChatPic cupic = (ChatPic)icon; PicInfo picInfo= new PicInfo(i,cupic.getIm()+""); myPicInfo.add(picInfo); sb.append(i+"&"+cupic.getIm()+"+"); } } System.out.println(sb.toString()); return sb.toString(); //return null; } 运行ChatFrame.java,改Sender.java,中的 端口,互换端口,再运行一次测试 Sender.java: /*默认发送端口*/ public static int SendPort = 5555; /*默认聊天端口*/ public static int chatPort = 6666; |
CopyRight 2018-2019 实验室设备网 版权所有 |