、、、汗、第一次发帖,发了3遍都没成功、、、
出于对UI比较感兴趣,忙中偷闲,尝试着用Swing模仿了一下QQ,实现了简单的聊天、添加删除修改群组、添加删除好友、
收到消息头像闪烁,可以发送文字(样式)和图片,业余之作还请各位大神不要喷,只是想自己记录一下顺便帮助一下其
他朋友,时间紧凑并且我编码水平不太好,代码看起来可能会比较杂乱无章,希望大家多多包涵,毕竟Swing用的太少了,碰到
了许多问题和困难,也是多方查资料和请教,借鉴了一些前辈高人的项目经验,如:IQQ等,在此,感谢所有帮助过我的朋友
服务器:使用Netty构建,负责消息的接收和转发,初衷是考虑到高并发(其实自己玩玩也没多大并发量),Mina和Netty
都是非常好的高并发框架,选择了Netty是考虑到他是一个新生儿,比Mina更有活力和潜力(当然,并不是说Mina
不好),据说两者皆可以达到普通电脑单台并发10万(没亲自尝试过,这数据也是在网上知道的)
客户端:使用Swing技术,选择这个是因为Java用的比较多,上班的时候也没时间来学习新技术,这里主要难点就是界面
的优化,有一大半的时间都花在了优化界面上(为什么这么困难呢:API没有深入去看;百度资料难找),有时
间会重新开贴将我遇到的一些界面优化难点来讲解一下,以便有需要的朋友
数据库:使用的是Oracle数据库(这个没问题,想改就改),这里没有采用任何框架,正好也是自己想复习一下JDBC(框
架用多了,基础的东西忘记了)
好了,不多说了,直接上图。。。
Tips:1、所有的界面都是重绘过的
2、登陆界面、注册界面、主界面都是继承自JDialog而非JFrame,众所周知,JFrame是用的最多的,但是我们既然
要模仿QQ那就要模仿的像一点儿,QQ登陆以及登陆之后都只有一个系统托盘图标而没有任务栏图标,可能大家
没接触过的话会感到很神奇,JFrame是一定有任务栏图标的,开始尝试着使用过JWindow,但是JWindow有一个
很不好的地方,他在焦点获取方面成很大难题,所以,小小JDialog撑起一片天啊
3、项目中的Dialog是我自己写的一个,很丑,但是用着还可以,基本功能都有(提示框、确认框),而且还可以拓展
为QQ新闻那种右下角提示
登录界面:当时纠结了一下的地方是鼠标进入文字,文字样式变为下划线,因为Java本身没有提供下划线的这种文字样式 (
还是我太笨没找到),所以采用了HTML的语法,毕竟Swing是支持其语法的,至于你们所看到漂亮的按钮和复选框,
那是我自己找的图片(使用Java本身的绘图技术也可以做到,我这里为了图简单,并且性能也会更好一点),大家
在做web项目的时候估计都用过复选框这个控件,它里面可以让你点击复选框后面的文字即可选中复选框,我们这里
没有这个属性,只要自己动手写一下,这样可以有更好的用户体验
注册界面:只有界面优化以及按钮滑入出现边框(大家一看就知道),就不多说了
Tips:可以看到自定义弹出框,嘿嘿,还没到丑到无法直视的地步
主界面:这个界面是使用上中下三部分拼接而成,背景是利用图片将jpanel重绘了,因为jpanel是不可以像jlabel一样
setIcon的,界面优化加布局, 以及Jtree组件的重构,才注册成功的账号拥有默认分组“我的好友”,没有任
何好友
Tips:昵称、签名、好友昵称、好友签名;
鼠标滑过分组以及好友节点的时候会呈现黄颜色,而当单击好友节点进行选中的时候则变为橙色,双击则是打开聊天窗口
Tips:没获取到焦点的时候是一串提示语,获得焦点之后出现搜索界面(搜索功能没有写,思路可以给大家提供一下,类似
QQ那样出现一个搜索面板覆盖掉下面的区域,从搜索框一下单独写一个面板使用cardlayout布局,我这里也是如此,
当搜索的时候将结果展示到面板上并替换掉当前面板)
Tips:对好友分组进行管理,添加、删除、修改以及添加好友到选中分组(默认分组“我的好友”是不允许修改和删除的),如果
添加删除分组则需要通过root根节点来reload以下Jtree以便将新分组将入到列表,因为在我的好友上一层其实还有一个root
节点的,只不过隐藏起来了,而如果是添加删除好友节点,则不需要从root开始,只刷新当前即可
Tips:这里我为了好看加入了三个测试(一个太丑了),删除好友功能没有确认是否将你冲对方的好友列表中移除的确认,会自动
将你从对方的好友也移除掉(确认很简单,传送消息的时候在消息体中加入一个确认变量为true或false即可)
Tips:群组和最近联系人,滚动条重绘是一大难点兼亮点(个人认为)
Tips:添加好友,界面很丑,多多包涵
Tips:请求发起者和接受者予以不同的提示
Tips:对方同意了之后,自己这里会看到提示,当然,如果你的好友列表是展开状态,不要这个友情提示也无所谓(有朋友可
能再想,为什么不监听其父节点是否展开,如果展开就不管,为展开就将其展开,这样是可以实现的,但是当好友很多
的时候展开需要用到循环,这样效率有些低)
Tips:删除分组以及修改分组,当然,删除好友的时候也会有确认提示,以免手误
Tips:界面有少许偷懒,大家莫鄙视
聊天界面:聊天总体控件使用了JFrame而没有采用JDialog,是因为需要随时打开,所以要在任务栏上可视,模仿了QQ的聊天窗
口合并效果(虽然我这里很丑,但是效果达到了),JFrame里面嵌套了JTabbedPane,我这里引入了一个开源Jar包
WEBLAF里面的WebTabbedPane,因为这个地方的优化耗费了很长时间还没能搞定,总是觉着太丑不好看,所以最
后放弃了(大家莫要鄙视,如果大家有好的方法可以指点我一下)
Tips:聊天窗口中难点在于JtextPane的运用(说这个是难点是因为,从jdk1.7开始,竟然没有自动换行这个属性了)、字体样式选
项优化、表情提示框,字体样式选项框就是jcombox的优化,说来惭愧,到现在都没能实现,若有朋友知道如何处理,还请
指点一下
Tips:除了截屏和jcombox未能优化之外,其余的都还能简单处理,这里需要注意的是表情的发送,尤其是图文混合的情况下,当时
在这里纠结了很长一段时间
呼呼、总算弄好了,发个帖子还真是困难啊
源码已上传到我的百度网盘:http://pan.baidu.com/s/1pJjxI4b,大家可以去下载来运行看看、
Bug肯定还是有的,大家遇到了可以告诉我,还有许多没能搞定的地方,如果有朋友会的也请
告诉我一下,QQ:1347384268,我们共同进步!