java 气泡聊天消息_Java Swing实现的仿QQ气泡消息聊天窗口效果

这篇博客详细介绍了如何使用Java Swing实现仿QQ气泡消息聊天窗口效果,特别是气泡的绘制和图文混排。通过自定义JTextPane子类,并在paintComponent方法中绘制气泡和小箭头,实现不同方向的消息头像适应。同时,利用并发队列存储消息显示信息,以确保多线程环境下的正确绘制。
摘要由CSDN通过智能技术生成

下面讲讲聊天窗口的上半部分聊天消息显示区域的具体实现,尤其是气泡的绘制、图文的混排实现。

先讲讲气泡的实现思路。开始我想过很多气泡的实现方法,在研究了JTextPane的文档类及其内容插入删除排版后,我想利用JTextPane能够插入JComponent的特点,直接把一个JLabel或者JTextPane给插入进去,作为段落显示,同时对这个JLabel或者JTextPane进行自绘,形成圆角矩形边框,模拟气泡的效果。但是后来发现这种方法对于段落的实际格式控制,尤其是气泡大小随聊天窗口区域变化而改变的适应能力不行,且气泡的小箭头出不来,所以放弃了。后来在网上看到了一篇很早的帖子在讨论关于利用VC和MFC在RichEdit中模拟QQ聊天气泡效果,得到了一点启发。气泡的绘制并不是与段落插入在同一个层面上,气泡是直接在历史消息显示区域的JTextPane的自绘中去实现,也就是在JTextPane的paintComponent方法中去绘制,而段落文本、图片的插入还是在JTextPane的层面上用其Document对象去负责。这里就存在一个问题,JTextPane怎么知道气泡绘制的区域大小和位置坐标?我是通过一个支持多线程并发的消息队列来保存每条消息的段落显示区域的大小及其位置。这个队列在JTextPane的Document插入每条消息的时候,对消息的段落区域进行计算,得到其显示区域大小及位置坐标,然后保存在队列中,而JTextPane的paintComponent方法里则不断对这个消息队列进行迭代枚举得到每条消息的显示区域的大小及位置然后依此进行气泡的绘制。这个队列采用的是Java里的concurrentLinkedQueue,能够实现基本的多线程无锁队列读写操作,这个特性在后面还会用得到,而且非常重要。下面是历史消息显示区域的JTextPane子类的自绘实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值