在大一聊天的课程设计中,遇到一个问题~~~~~发送图片表情的问题
下面单介绍发送表情
表情是存储在客户端本地的(每个客户端都有,你要用QQ的到QQ安装目录下找)
所以发送表情的思想:
用户点击【表情】--- 跳出对话框---点击一个表情---在输入框里加入标识符我用的是#号+两位数字
点【发送】---在接收端解析-----到本地寻找相应的表情---加载插入
大前提:在java中JTextArea不支持图片-----只能用JTextPane 而且JTextPane没有append()方法,只有getText(),setText()方法(setText()每次都盖掉以前的)
要实现insertString()必须注意实现几行代码(即相当于append()添加而不是覆盖),下列用AAAAA标记出
首先,我在 D:/abcd/表情中加入了18个表情 #01 --- #18 格式gif 注意:一定统一位数,以防识别错误
JTextPane MsgArea=new JTextPane();//将接收显示区域设置为JTextPane
接受端的处理
mywords = inputField.getText();//将接受到的数据转换为String
manageInfo( mywords);//调用此方法处理String,分别解析出文字表情
manageInfo("/n");//刷上分行
//处理接受到的信息的方法,加参String 通过此方解析表情文字
//有时间就分析下咯,没时间的话注意几行~~~~我用AAAAAA标记出了
public void manageInfo(String info)
{
int length=info.length();//获取String 长度
char[] every=new char[length];
int count=0;//初始字符的位置,变化
String path="D://abcd//表情 //";
//实现insertString()的必要前提
Document doc = MsgArea.getStyledDocument();//AAAAA 后面insertStirn 用到doc,insertIcon用到MsgArea
SimpleAttributeSet attr=new SimpleAttributeSet();//AAAAA
Boolean hadjin=false;
for(int i=0;i
{
every[i]=info.charAt(i);
if(every[i]=='#') //识别信息中是否有#号
hadjin=true;
}
//开始玩拆字游戏
for(int i=0;i
{
if(hadjin=false)
break;
if(every[i]=='#')
{
String str=null;
str=info.substring(count,i); //得到表情前的文字
try{
if(str!=null)
doc.insertString(doc.getLength(), str, attr);//AAAA添加表情前的文字
}catch(Exception e){
System.out.println("a big error here");
}
String icName;
icName=info.substring(i, i+3); //得到表情的名字 #01
Icon ic=new ImageIcon(path+icName+".gif");//将表情转化为icon
MsgArea.setCaretPosition(doc.getLength());
//获取当前的位置,将表情插入到当前最下~~~~
//没有此表情将出现在JTextPane的最上方,无法出现在当前行
MsgArea.insertIcon(ic); //加入表情
count=i+3;//将字符起始位置跳到表情后第一位置
}
}
if(count
{
String theLast=null;
theLast=info.substring(count, length);
try{
doc.insertString(doc.getLength(), theLast, attr);
}catch(Exception e){
System.out.println("a big error here");
}
}
}
效果:用的是梦幻的表情~~~呵呵
PS:1.貌似解析信息的时候有个很好的方法split
没用过,有空补上
2.发送多行就一行一行发,然后一行一行处理
我晕,当时交的时候太简陋了,刚及格【有点郁闷】,好歹是自个花了两礼拜写的
这礼拜重新写了个,在增加功能,发文件,语音什么的~~~~