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

本文详细介绍了使用 Java Swing 实现聊天程序的方法,包括表情框显示、文本与表情信息传输、震动效果及悬浮提示框的实现。通过自定义 ImageIcon 类和 JTextPane 的 StyledDocument 对象,成功实现了表情和文本的混合显示,并解决了字体属性的设置与传输难题。示例代码展示了如何在聊天窗口中加入表情图片,以及如何将表情位置和代号进行编码传输,确保了双方程序能够正确解析并显示表情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载地址: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<PicInfo> myPicInfo = new LinkedList<PicInfo>();

 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;

小明用基于socket通道做了一个实时聊天实现了多客户客户端、服务端的实时通信,但是老师要求每个人都有自己的独特功能........于是,小明想,创新是不可能创新的,那现在QQ的工鞥有什么能够移植的呢,,,小明效果了一圈,发现大多功能都是基于文件传输,去找了一下socket的文件传输,果断撂挑子。还有什呢,要不就自己客户端约定好,特殊的字符串表示特殊操作,比如下面小明要举个例子:                                                                                                                                   有两个客户端A、B,客户端都是一模一样的,里面资源实现存放好10张图片,并且约定:发送消息为“@”的时候,这个字符串后边会跟着一个数字,咱们两个同时把数字代表编号的图片输出到聊天框,如                                                                A发送给B:@     那现在,两个客户端就会把3号图片输出到聊天框,造成发送的是图片的假象 说干就干,先实现自己窗口判断输出图片,在获取于是先在获取聊天输入区文本时做判断(我正添加表情按钮,到时候就不用记住暗号了),在输出相应编号图片,欸不对啊,这个聊天信息展示区是个文本框啊,那就给改成面板,使用新建面板类,使用流式布局规定布局宽度(不然他会横着输出消息)然后是面板添加滚动条,然后再聊天区打出来就好了 ----(一个积分,望土豪点一点,我也想恰饭) 你们看到这个代码的时候,我主页应该就有相关博文了,大家可以去参考
评论 362
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值