设计思路

表情包是我们聊天中经常使用的功能,他的实现有两种办法。一种是使用Unicode中编码的700多种的表情字符。另外一种是使用图片来充当表情包。
1.从2010年开始,unicode对emoji表情包进行了标准化。Unicode标准定义了700多个表情符号。每个表情符号都被定义为一个Unicode字符,并且具有其唯一的Unicode代码。这些表情包我们可以直接在输入法中输出使用,但是这些表情包在JavaFx中的显示不是像手机中的那样,这是因为只有特定的字体才支持表情包图片加载。
2.使用图片表情包,发送时转换为unicode编码,接受到后转换为图片名字。
第一篇参考文章主要讲怎么在JavaFx中显示Unicode表情,提醒我们需要相关字体支持才能够显示。第二篇参考文章主要讲如何使用图片发送表情包,我们发送消息时将选择的表情包转换为Unicode发送,对方收到Unicode再转化为图片来显示。我们主要也是使用第二种方法实现表情包功能。
参考 How to support Emojis (Part1) by Hendrik Ebbers on Jan 21, 2015
参考 EmojiOneJava
Java聊天室参考

EmojiOneJava学习

该项目一共有两个示例,一个是表情包选择查询,一个是表情包如何显示到TextFlow。我们主要学习第一个,第二个比较简单。
这个项目主要核心就是将对应的Unicode解析为表情图片显示到窗口中。项目中有对应的Unicode编码的图片、每个图片对应的表情包的类、解析加载和操作表情包的类、表情包对应的窗口。这个项目一共有1920个表情,分成了8个类别的不同表情,每个类别中还有不同颜色的同种表情。这八种表情包分别显示在不同的Tab标签页中,另外还拥有查询功能,可以使用unicode、英文缩写或者ascii进行查询。我们也能扩展自己的表情包,只要将图片和json对应上,代码做相应修改就行了。

EmojiOneJava修改

我们不需要原本的选择功能,我们将肤色切换取消,修改相应的分类函数。删除了原来的切换按钮,修改了窗口风格,并且为表情包窗口设置了父窗口。

public class EmojiOne {public Map<String, List<Emoji>> getCategorizedEmojis() {Map<String, List<Emoji>> map = new HashMap<>();emojiMap.values().forEach(emojiEntry -> {List<Emoji> list = map.computeIfAbsent(emojiEntry.getCategory(), k -> new ArrayList<>());list.add(emojiEntry);});map.values().forEach(list->list.sort(Comparator.comparing(Emoji::getEmojiOrder)));return map;}
}

Emoji整合

在原先输入框前加入一个按钮代表表情包选项,点击后弹出表情包选择框。

我们选择表情后,在输入框会变成对应的缩写,发送消息时直接将这串字符串发送。在网上查了一下,没有找到如何在TextArea中显示图片的方法。

我们收到消息后,后台会解析出消息中是否含有表情包缩写,如果有就解析为一个StackPane中包含ImageView的节点,加入到TextFlow中。表情包与字体始终无法垂直对齐,看着像是基线对齐。在网页端我们遇到这种文字和图片共存的时候,通常可以设置其垂直对齐方式,默认是基线对齐,我们只要设置为text-top对齐就可以了。但是TextFlow没有设置垂直对齐的方法。

总结

简单的实现了聊天功能,但是没办法做到像微信一样,还有很多功能没有实现,发送图片,发送文件,视频聊天等等。以后会将JavaFx替换掉,资料太少,学习成本太高。

JavaFX+NIO聊天室第四篇表情包相关推荐

  1. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  2. golang实现聊天室(四)

    golang实现聊天室(四) 服务端给已经建立连接的客户端发送消息 client1 func main() {var conn, err = net.DialTimeout("tcp&quo ...

  3. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  4. java NIO及NIO聊天室

    参考链接: java NIO实例1:http://blog.chinaunix.net/uid-25808509-id-3346228.html java NIO教程之selector(一系列): h ...

  5. BIO/NIO聊天室

    Socket demo BIO Client端 客户端主入口 UDPClient serverinfo bean TCPClient Server端 server 入口函数 UDPServer TCP ...

  6. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能...

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  7. php mysql 聊天室_聊天室phpmysql(四)

    聊天室php&mysql(四) 2019-07-05 编程之家收集整理的这篇文章主要介绍了聊天室php&mysql(四),编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考. ...

  8. 使用WebRTC搭建前端视频聊天室-01——入门篇

    什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器.乙和服务器之间建立信道.甲给乙发 ...

  9. 纯js 实现简单聊天室,可发送表情、图片、发送消息时间

    对项目代码有什么不懂的,欢迎留言一起探讨 <!DOCTYPE html> <html><head><meta charset="utf-8" ...

最新文章

  1. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树
  2. HTML图片热区map area的用法(转)
  3. python序列类型-Python之序列类型方法
  4. 解读main()方法中的String[] args
  5. 微软Silverlight4与Adobe Flex4打成平手,SL与FLEX技术全面对比
  6. LeetCode 111. Minimum Depth of Binary Tree
  7. mysql居左查询abcd_数据库--查询语句
  8. Redis 学习---Redis 安装(2)
  9. 取代安卓梦碎!鸿蒙系统不用于手机
  10. c语言猜拳游戏实验报告,《猜拳小游戏》--一个c语言写的小项目
  11. python打开360浏览器_Selenium安装与360浏览器使用
  12. Eclipse JEE Mars 2 配置 WSO2 ESB 5.0.0 环境
  13. 网页爬虫-八爪鱼Xpath自定义数字翻页
  14. Python爬虫之爬取实习僧并导入Mysql
  15. 杭州造云记 | 甲子光年
  16. 基于CNN的人脸 性别、年龄识别
  17. Qt模仿网易云黑胶片转动动画
  18. ODPS SQL优化总结
  19. PCB设计技巧10大技巧
  20. 2021年中国教育行业发展现状及未来发展趋势分析:在校生人数达2.91亿人[图]

热门文章

  1. blockly自定义中文出问题_Blockly教程 创建自定义块-Blockly 开发者工具
  2. WebRTC技术简介-RTCPeerConnection
  3. 在BIOS中设置电脑开机密码
  4. python etree爬取去哪儿数据
  5. ASUS华硕笔记本电脑枪神6Plus超竞版ROG Strix G733CW 3070Ti原装出厂Win11系统恢复原厂oem系统
  6. 【笔记】【机器学习基础】1.7 鸢尾花分类
  7. JavaWeb用户注册登录案例(使用mysql数据库)
  8. dibea地贝扫地机器人怎么样_地贝扫地机器人怎么样—地贝扫地机器人的特点介绍...
  9. 阴阳师妖怪屋如何在电脑上玩 阴阳师妖怪屋电脑版玩法教程
  10. XP下 Linux 硬盘镜像安装 CentOS 6.3 找不到镜像文件的解决办法