java swing 聊天表情功能的实现(带完整代码) 您所在的位置:网站首页 制作表情包的字体软件 java swing 聊天表情功能的实现(带完整代码)

java swing 聊天表情功能的实现(带完整代码)

2024-06-30 12:59| 来源: 网络整理| 查看: 265

下载地址: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 实验室设备网 版权所有