最近做了聊天气泡功能,为自己的聊天室美化了一下聊天效果;

先来看一下效果:

主要的思路是:以一个JTextPane作为显示的面板,然后自定义一个组件JBubble气泡组件来实现他的聊天气泡,然后通过JTextPane中的insertComponent(jbubble);方法把组件添加

到JTextPane上。同时通过setCaretPosition(count);方法设置添加到末尾,count为当前以及有的组件的书目加一;

一:具体的过程:

(1)自定义JBubble组件:继承JComponent,重写paintComponent(Graphics g) 方法

在java中,所有的组件都是画出来的,所以这个聊天气泡画出来的;具体的步骤是:

首先画出发消息的人的头像 :g.drawImage(img, x, y, width, height, observer);

再画出消息箭头 g.fillPolygon(xPoints, yPoints, nPoints):通过给定缺点的几点来画一个多边形出来,第一个参数是一个是该多边形的所有的点的X轴坐标,第二个参数是该多边形的所有的点的Y轴的坐标,第三个点是该多边形的点数;

然后在根据消息的宽度,以及高度,画出消息矩形框:g.fillRoundRect(x, y, width, height, arcWidth, arcHeight);

最后画出文字:g.drawString(str, x, y);

在构建组件的时候需要去区分一下是自己发的消息,还是他人发的消息,这样不同的发送方,画的位置不一样。

在实现这个组件中需要解决的问题是:

确定文字的高度和宽度

消息矩形框的高度和宽度是根据一段字符串的高度以及宽度来确定的。然后还需要考虑的是当字符串的宽度大于组件的宽度的时候我们就需要来考虑一下文字的换行问题;

在java中提供了一个FontMetrics类来可以获取文字的大小:

FontMetrics fm = FontDesignMetrics.getMetrics(font);

int width = fm.stringWidth(message);// 获取整个字符串的宽度

int height = fm.getHeight();//获取字符的高度

在JBubble组件中利用了一个ArrayList来存储以及分好行的字符串,之前用过一个String类型的数组来存储,但是后面发现,每一个字符的宽度是不一样的(中文与英文以及数字之间是不一样的),所以不能够通过整除来确定划分的字符串的长度。虽然想过通过正则表达式来区分英文以及中文,数字这样,然后来进行分行,但最后还是选择了一种简单地方法;

(2) MessagePane类:实现文字和图片的处理,然后添加到JTextPane上面

为了划分字符串,实现分行,定义了一个MessagePane来管理所有的消息气泡;

主要的属性是:一个JTextPane对象,以及两个ImageICon对象来表示自己的头像以及他人的头像;然后两个int,分别表示一个组件的宽度以及 JTextPane中的组件的数目;

主要的方法是:

addTextMessage(String messages, boolean fla);添加文字消息;

换行的操作比较简单,利用while循环来遍历整个字符串,当一段字符串的长度大于字符的时候就存入ArrayList中;

/***

* 添加文本消息

*

*@parammessages

* 要添加的消息

*@paramfla

* 是否是自己发送的消息*/

public void addTextMessage(String messages, booleanfla) {

Font font=jtextpane.getFont();//获取字符串的高度

int sHeight =getWordHeight(font, messages);

System.out.println("字符串取得的高度为" +sHeight);//获取字符串的宽度

int sWidth =getWordsWidth(font, messages);

System.out.println("字符串取得的宽度为" +sWidth);//存储分行的字符串

ArrayList str = new ArrayList();if (sWidth > width - 100) {//int i=0;

int beginIndex=0;int endIndex=1;while( endIndex

String s=messages.substring(beginIndex,endIndex);if(getWordsWidth(font, s)>(width - 100)||endIndex==messages.length()-1){

str.add(messages.substring(beginIndex,endIndex-1));

beginIndex=endIndex-1;

}

endIndex++;

}

}elsestr.add(messages);

JBubble jbubble= new JBubble(sHeight, getWordsWidth(font,str.get(0)), str, fla);if(fla)

jbubble.setUserIcon(userIcon);elsejbubble.setUserIcon(otherIcon);

jbubble.setPreferredSize(new Dimension(width, sHeight * (str.size() + 1) + 30));

jtextpane.insertComponent(jbubble);

count++;

jtextpane.setCaretPosition(count);//jtextpane.repaint();

}

原文:http://www.cnblogs.com/hesi/p/6445264.html

java 气泡_JAVA实现聊天气泡相关推荐

  1. Java Swing中的聊天气泡

    本文将向您解释"如何在Java swing应用程序中绘制聊天气泡?" 聊天气泡与呼出气泡或思想气泡相同. 今天,大多数聊天应用程序都以这种格式显示转换,因此本文将帮助您在用Java ...

  2. android 聊天气泡背景图片,聊天气泡背景图片拉伸设置

    以前一直对类似聊天气泡背景图片拉伸的设置纠结,不管如何设置UIEdgeInsets属性都不能正常设置,今天对以下几种情况进行了总结,如有需要的同学可进行参考: 说明: /** 1.UIEdgeInse ...

  3. android气泡组件,Android 聊天气泡

    网上搜到的只有一篇是自定义的TextView,其使用比较麻烦,所以采用大众化的方法--使用9.png来实现. 这里主要介绍sdk tool的draw9patch.bat的使用. 这个bat执行文件打开 ...

  4. java swing 聊天气泡_Java Swing中的聊天气泡

    本文将向您解释"如何在Java swing应用程序中绘制聊天气泡?" 聊天气泡与呼出气泡或思想气泡相同. 今天,大多数聊天应用程序都以这种格式显示转换,因此本文将帮助您在用Java ...

  5. swing 聊天气泡背景_Java Swing中的聊天气泡

    swing 聊天气泡背景 本文将向您解释"如何在Java swing应用程序中绘制聊天气泡?" 聊天气泡与呼出或提示气泡相同. 今天,大多数聊天应用程序都以这种格式显示转换,因此本 ...

  6. CSS3实现自适应的聊天气泡

    边框图片 功能:将图片规定为包围 div 元素的边框 a) 定义和用法: border-image 属性是一个简写属性,用于设置以下属性 border-image-source border-imag ...

  7. android 聊天气泡_android聊天气泡在android中构建ios风格的聊天

    android 聊天气泡 重点 (Top highlight) In this post, we'll explore how to do two things: 1) create live cha ...

  8. java 气泡_JAVA实现QQ聊天气泡

    最近做了聊天气泡功能,为自己的聊天室美化了一下聊天效果: 先来看一下效果: 主要的思路是:以一个JTextPane作为显示的面板,然后自定义一个组件JBubble气泡组件来实现他的聊天气泡,然后通过J ...

  9. JAVA实现QQ聊天气泡

    最近做了聊天气泡功能,为自己的聊天室美化了一下聊天效果: 先来看一下效果: 主要的思路是:以一个JTextPane作为显示的面板,然后自定义一个组件JBubble气泡组件来实现他的聊天气泡,然后通过J ...

最新文章

  1. OpenSSL生成自签名的sha256泛域名证书
  2. gRPC学习记录(四)--官方Demo
  3. IOS开发基础之网易新闻UICollectionView的使用第3天
  4. Could not load driverClass “com.mysql.jdbc.Driver“
  5. 关于Istio 1.1,你所不知道的细节
  6. 怎样重启计算机来关闭u口,从电脑USB接口吹了一口气结果电脑直接关机,按重启也带不起来了,该怎么办?...
  7. OpenGL入门-2-颜色
  8. asp.net文本编辑器FCKeditor使用方法详解 - 橙色大地 - 博客园
  9. java自定义annotation_Java自定义annotation | 学步园
  10. PLSQL 连接不上
  11. wps android 接口,Android调用WPS接口打开office类型文件
  12. 讲解wpe抓包,封包
  13. 港台术语与内地术语之对照
  14. 指数基金日涨跌幅python_Python数说指数定投策略
  15. 阿里云上部署的SQL Server服务器和SVN服务器不能远程访问
  16. python爬虫英文单词_非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本...
  17. 用verilog 蜂鸣器的演奏乐曲
  18. 云标签,关键字图排版 html5 canvas版
  19. cad制图与计算机方面的联系,计算机与CAD制图理论知识.doc
  20. SpringCloud Netfilx全家桶+ Alibaba(nacos、sentinel、seata) 快速配置,快速启动

热门文章

  1. PS海报制作的常用方法
  2. 三星A7100手机更换电池方法拆电池方法
  3. 小白要努力之为了蓝桥杯刷题!!!超简单哦!!!
  4. 20年3月27日,Github被攻击。我的GitPage博客也挂了,紧急修复之路,也教会你搭建 Jekyll 博客!
  5. 智能家居第一步: WiFi 设备怎么连上网
  6. 加密市场的牛熊周期;NFT 定义的争论
  7. 【AE软件】视频添加字幕
  8. trackerslist GitHub12月无重复更新版
  9. 乐鑫ESP32 NVS读错误BUG:nvs_get_blob
  10. 电赛硬件电路设计抗干扰措施