毕业设计(论文)-基于JAVA语言的网络聊天系统开发与实现.doc_第1页
毕业设计(论文)-基于JAVA语言的网络聊天系统开发与实现.doc_第2页
毕业设计(论文)-基于JAVA语言的网络聊天系统开发与实现.doc_第3页
毕业设计(论文)-基于JAVA语言的网络聊天系统开发与实现.doc_第4页
毕业设计(论文)-基于JAVA语言的网络聊天系统开发与实现.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2015届本科毕业论文(设计)基于java语言的网络聊天软件姓 名:xxxx系 别:计算机与信息技术学院专 业: 计算机科学与技术 学号:xxxxxxxx指导教师:xxxxxx2015年05月08日 目录摘要iiabstractii1 软件介绍31.1 背景31.2 目的32 开发技术32.1 界面层技术32.2 通信层技术32.3 数据层技术33 开发环境43.1 硬件环境43.2 软件环境44 需求分析44.1 客户端需求分析44.2 服务器需求分析44.3 数据层需求分析45 系统架构56 设计实现56.1 消息封装类message56.2 服务器66.2.1 主服务器server66.2.2 虚拟服务器virtualserver66.2.3 登录验证logon76.2.4 hibernate配置文件86.2.5 hibernate会话工厂86.2.6数据操作类 userdao96.2.7 数据操作类 crowddao106.2.8 表结构设计106.2.9 用户类user116.2.10 群组类crowd116.3 客户端116.3.1 client116.3.2 登录界面logon136.3.3 好友界面friend146.3.4 聊天界面chart156.3.5 游戏界面game166.3.6 游戏规则176.3.7 算法思路177测试说明18总结感想19参考文献20致谢20i基于java语言的网络聊天软件摘要本聊天软件是使用java编程语言来完成开发的。在软件的开发过程中,使用socket来进行网络通信,使用swing来绘制界面,使用开源的对象关系映射框架hibernate来进行数据访问。其中hibernate能够使程序员以面向对象的思维来处理关系型数据。本聊天软件不仅支持聊天,还加入了“连连看”游戏。该游戏让人们之间的交流得到延伸,让彼此之间的关系更进一步。本聊天软件主要有以下三个功能:一、登录验证;二、聊天通信;三、游戏互动。关键词聊天;java;swing;套接字;hibernatenetworkchatsoftwarebasedonjavalanguageabstractthischatsoftwarewasdevelopedbyusingthejavaprogramminglanguagetocomplete. intheprocessofsoftwaredevelopment,socket is used for network communication, swing is used to draw the interface, object relational mapping framework hibernate open source is used for data access.hibernateallowsprogrammerstodealwithrelationaldatainobject-orientedthinking. thischatsoftwarenotonlysupportchatatthesametime, alsojoinedthe linkupfree game. thegameallowscommunicationbetweenpeoplehasbeenextended, sothattherelationshipbetweeneachothermore.thissoftwaremainlyhasthefollowingthreefunctions: first, landingvalidation; second, chatcommunications; three, theinteractionofthegame.keywordschat; java; socket; swing; hibernate21商丘师范学院2015届本科毕业论文(设计)1软件介绍1.1 背景在当今世界,人们的追求早已不局限于物质生活,而更多的是渴望在精神领域上得到满足,这突出表现在我们的人际交往上。人们渴望与远在天涯又或是近在咫尺的亲朋好友无拘无束地沟通,而此时此刻一款即时通讯工具对于我们来说,它的重要性不言而喻!在计算机网络愈来愈普及的今天,人们对于网络的依赖也愈来愈大,类似于qq、msn等聊天工具早已融入到我们日常生活中,为我们的生活带来了欢乐和便利。因此,我力图开发一个在线的即时聊天软件以满足我们在日常生活中交流的需要,为我们的生活增光涂色。1.2 目的本聊天软件以通信为其核心,同时融入了娱乐的元素,一款十分经典的“连连看”游戏。让我们在聊天的同时还能与好友一起通过游戏来增进彼此的感情,让彼此的心更加靠近,让我们的生活从此不再单调。本聊天软件是在windows环境下进行开发的。通过swing实现操作界面的设计,使用java语言中的socket(套接字)来实现网络之间的通信,使用hibernate框架来进行数据的增删改查,而mysql数据库则用于数据的存储与管理。在开发的过程中综合运用自己所学到的各种技术,一方面强化我在学校里学到的知识与专业技能,另一方面也使得我更好地去理解有关软件开发的流程与思想。这些能力与经验都将为我后续的学习和工作打下坚实牢固的基础,不断地提升个人的职业素养。同时,本聊天软件将不断与信息领域的系统相互集成和渗透,向校园、集团等群体进行拓展,应用将突破个体,并应用于远程教学、远程演示、网络会议等。以丰富的接入方式,以保质保量的服务,以友好的用户体验呈现在世人面前。并且不断地扩大功能与应用范围,满足未来时代的话音。2开发技术本聊天软件用到的技术涉及到3个层面,它们分别是:界面层、通信层、数据持久化层。2.1界面层技术使用java中的swing来进行操作界面的开发。swing是一款功能强大,使用方便,跨平台的图形界面开发工具包,专门用于开发java应用程序的用户界面。swing允许您设定自己喜爱的界面风格,它可以是跨平台的java风格,也可以是我们熟悉的window风格,这一点是其他界面开发工具很难比拟的。2.2 通信层技术利用java中的socket(套接字)来完成客户端与服务器的交互。该socket是基于tcp/ip通信协议的数据传输对象,它提供了安全可靠的通信机制。在服务器使用serversocket创建监听端口,而在客户端则使用socket来连接服务器。在连接成功时,应用程序的客户端和服务器都将产生一个socket实例,本聊天程序就是通过利用这个socket实例来实现两段的通信和其他功能。在通信的过程中我也使用了多线程编程技术以实现复杂的交互行为。尤其是在服务器端,服务器每接收一个客户端就会产生一个虚拟服务器来单独为其服务。通过该技术的运用使得本聊天软件可以允许多人同时在线与自己的好友畅怀的交流。2.3数据层技术考虑到现如今框架技术的兴起,在数据层的处理上我也使用了开源的对象关系映射框架hibernate。它对java的数据库连接(jdbc)进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用面向对象编程思维来操纵数据库。本聊天软件使用mysql作为数据持久化存的储器。mysql是一个真正的多用户、多线程数据库服务器,是以客户端/服务器架构实现的,它由一个服务器守护线程和很多不同的客户程序和库组成。mysql是一种关系型数据库管理系统,通过表来管理数据,增加了处理数据的速度并提高了操作的灵活性。hibernate+mysql的组合在数据的处理上让我变得得心应手,同时也让这个程序变得更加强壮与稳健。3开发环境3.1 硬件环境硬件配置:amdx64兼容桌面平台。3.2 软件环境操作系统:windows8.1企业版。jdk版本:jdk_8。数据库:mysqlserver5.6。开发工具:myeclipse2015。第三方工具包:hibernate。4需求分析本聊天软件是在c/s模式下完成开发的,整个系统分为两个重要的组成部分:客户端、服务器。在客户端用户可以通过登录模块进行登录操作,登录成功的用户则进入到好友列表界面;选中指定的好友,就可以发起与该好友的会话,通过聊天模块与好友相互嘘寒问暖;在聊天模块中,既可以发送消息,同时也可以发起与该好友的游戏互动,在pk中一决雌雄。在服务器,服务器要为每个用户进行服务,对用户登录信息进行验证,接受来自用户的消息请求并按照消息的类型进行各种不同的操作和处理。4.1客户端需求分析客户端实现的功能主要有:1.登录模块:用户在登录界面中输入个人身份信息,由客户端将信息传递至服务器进行用户合法性的验证,验证成功,则跳转到聊天模块,否则给出相关提示。2.好友模块:显示好友列表,通过该模块可以发起与好友的会话或者游戏。3.聊天模块:能够及时的发送用户的文本消息,同时能够即时地将好友发过来的消息展现出来。4.游戏模块:开启两个好友之间的游戏互动。5.界面效果:布局整洁、大方;色彩光鲜、夺目;操作简单、舒适。4.2服务器需求分析服务器作为后台程序,实现的功能主要有:1.能够接收每个客户端的通信连接。2.调用数据访问层来验证用户的个人信息。3.能够及时接受用户的聊天消息并进行消息的转发。4.3数据层需求分析数据层实现的功能主要有:响应来自服务器的数据访问请求。5系统架构本系统以客户端、服务器以及数据库三维一体构建起了系统的整个架构。图5-1 系统架构客户端:用户在客户端的所有操作都依赖于客户端的守护线程client来完成,该线程负责与服务器进行数据交互。当用户需要登录时,由登录模块调用client向服务器发送身份验证请求。服务器接收到该验证请求之后便进行验证处理并返回验证结果给client。如果client判定验证成功则从验证结果中提取出个人信息并开启好友模块;当用户在好友模块中打开了一个聊天模块后,便可以调用client来进行聊天消息的传递;如果打开的是游戏模块,则先完成游戏的一方调用client向另一方发送获胜消息,并终止另一方的游戏。服务器:服务器分为主服务器与虚拟服务器。主服务器server作为服务器的守护线程,主要负责接收客户端的连接,在服务器接收到一个客户端后,就开启一个虚拟服务器virtualserver来为该用户服务;虚拟服务器通过调用底层的登录模块等来为用户提供登录验证等服务。本架构中,借用了spring中的分层思想,这也是在软件项目开发过程中经常采用的方案。将操作或功能分为不同的层次,各层次之间想对独立,高层调用底层的功能,低层为高层提供服务。一方面,可以将同种类型的操作放在一起集中管理。另一方面,将操作提取出来,提高了代码的复用性和程序的扩展性。分层使得程序流程变得清晰明了,而且维护成本相对低廉1。6设计实现6.1消息封装类messagesocket:套接字,在本聊天软件中作为客户端与服务器之间通信载体,为系统的交互提供支撑。为了方便开发,我将客户端与服务器之间传送的消息封装成一个消息对象类message.。继而使用从socket获取的对象输入流、对象输出流来收发消息对象2。封装的消息类代码如下所示:/消息封装类实现了序列化接口publicclassmessageimplementsserializableprivatestaticfinallongserialversionuid = -2842889997276284663l;privateintegertype;/消息的类型privatedatesendate= newdate();/消息创建的时间privateusersender;/消息的发送者privateuseraccepter;/消息的接收者privatestringcontent;/消息的内容其中,消息的类型在服务器和客户端都遵循着统一的标准。这样的话,客户端发给服务器什么样的消息,服务器在解析出消息的类型之后,就可以进行相应的操作了。为了实现消息载体以对象的形式在网络间进行传递,该消息类必须实现java中的序列化接口,这一点是其他通过字节流或者字符流传递消息所不同的。6.2服务器6.2.1主服务器server主服务器主要充当一个前置服务,用来接收客户端的连接。在获得一个客户端的连接后就会产生一个虚拟服务器,并将该连接委托给虚拟服务器让它来为用户提供服务。同时主服务器也维护着所有的虚拟服务器,它扮演着一个管理者的角色3。/服务器维护的虚拟服务器列表,一个map集合,通过这种键值对的对应关系来管理虚拟服务器。privatestatichashmapusersol = newhashmap();try serversocket = newserversocket(port);/这里通过无限循环,来不停地接受用户的连接。while(true) clientsocket = serversocket.accept();/接收客户端的连接newthread(newvirtualserver(clientsocket).start();/开启虚拟服务器来为其服务 catch (ioexceptione) /异常处理6.2.2虚拟服务器virtualserver虚拟服务器才是真正的服务载体,当它接收从主服务器哪里得到的来自客户端的连接后,便可进行一对一的服务。所有的消息都经过它来处理。当虚拟服务器之间需要交互时,虚拟服务器可以从主服务器那里拿到主服务器所维护的虚拟服务器列表。并从中根据键值对来获取指定的虚拟服务器,然后再进行后续的操作。该类实现了runnable接口,该接口是将线程所运行的程序代码提取出来封装成为一个对象。runnable对象可以用来创建线程。privateuseruser = null;/虚拟服务器所服务的用户overridepublicvoidrun() booleanb = true;/线程结束控制符/接收来自客户端封装的消息对象messagemsg = null;while(b) try msg = (message)input.readobject();/客户端client发送过来的消息对象/根据消息的类型进行不同的处理if(msg.gettype() = 10) /登录验证操作messagereturnmsg = newlogin().validate(msg.getsender();/登录验证if(returnmsg.gettype() = 13) /验证成功,则将该虚拟服务器添加到主服务器管理的虚拟服务器列表server.getusersol().put(returnmsg.getaccepter().getaccount(), this);send(returnmsg);elseif(msg.gettype() = 20) /转发聊天消息server.getusersol().get(msg.getaccepter().getaccount().send(msg);send(msg);elseif(msg.gettype() = 30) /退出操作server.getusersol().remove(user.getaccount();thread.currentthread().interrupt();/结束当前线程elseif(msg.gettype() = 40) /邀请好友进行游戏server.getusersol().get(msg.getaccepter().getaccount().send(msg);elseif(msg.gettype() = 41) /好友同意游戏邀请,双方开始游戏messagem = newmessage();m.settype(42);m.setaccepter(msg.getaccepter();server.getusersol().get(msg.getaccepter().getaccount().send(m);m.setaccepter(msg.getsender();send(m);elseif(msg.gettype() = 43) /拒绝好友的游戏邀请server.getusersol().get(msg.getaccepter().getaccount().send(msg);elseif(msg.gettype() = 44) /由获胜方通知失败方,胜负情况server.getusersol().get(msg.getaccepter().getaccount().send(msg); catch (exceptione)/异常处理b = false;/如果出现异常则修改线程终止符,使线程结束。从源码中可以看出,虚拟服务器主要的工作,就是解析消息的类型,并根据消息的类型进行相应的处理。例如在消息的类型为10时,虚拟服务器就调用登录验证logon来对用户的信息进行验证,根据登录验证的验证结果,再返回相应的消息给客户端的client。6.2.3登录验证logonprivatestaticuserdaouserdao = newuserdao();/调用底层的用户数据访问功能publicmessagevalidate(useruser) messagemsg = newmessage();/返回验证的结果信息useru = userdao.findbyaccount(user.getaccount();/账户存在if(u = null) /账户不存在msg.settype(11);msg.setcontent(账户不存在!);else/该账户存在u = userdao.findbyaccountandpassword(user.getaccount(), user.getpassword();if(u = null)/密码不对msg.settype(12);msg.setcontent(密码不对!);else/账户、密码正确if(server.getusersol().get(user.getaccount() = null) /可以登陆msg.settype(13);msg.setaccepter(u);else/已登录msg.settype(14);msg.setcontent(不能重复登录!);returnmsg;登录验证,主要分为三步:1.首先验证用户的账号合法性,即该账号是否存在。只有账号存在才会进行后续的验证。2.如果用户的账号存在,再验证密码是否与账号匹配,如果匹配成功,则返回该用户的信息。3.接下来则从主服务那里去判定该用户是否已经登录,对于已登录的用户则不再给予登录操作。6.2.4hibernate配置文件访问数据的操作要借助hibernate框架来完成。使用了hibernate,我们就可以不用再写很复杂繁琐的jdbc语句去建立与数据库的连接,而将这些操作全都交给hibernate来完成。hibernate的配置文件如下:truecom.mysql.jdbc.driverjdbc:mysql:/localhost:3306/nfcroot846255org.hibernate.dialect.mysqldialectcreate6.2.5hibernate会话工厂在完成了配置之后,为了可以使用它来进行数据的操作,我们需要先创建会话工厂,因为数据的操作是基于会话的。会话工厂的代码如下:publicclasshibernate privatestaticsessionfactorysf = null;/会话工厂privatestaticsessionsession = null;static configurationcf = newconfiguration();cf.configure();/在默认路径下,读取配置文件。serviceregistrysr = newstandardserviceregistrybuilder().applysettings(cf.getproperties().build();sf = cf.buildsessionfactory(sr);session = sf.opensession();privatehibernate() publicstaticsessionfactorygetsessionfactory() returnsf;publicstaticsessiongetsession() returnsession;这里的会话工厂sessionfactory使用的是java设计模式中的单例模式,唯一的sessionfactory对象能够保证数据操作的可控性,让我们能够利用事务有效的保证被操作数据的一致性。在配置文件中罗列出了所使用的实体类,通过在实体类中使用相应的注解标明,hibernate就可以将一个实体类映射为一张表,而实体类的属性则将映射为表中的字段。实体类就相当于一张表,为了操纵它,我为实体类分别写了一个操作类。利用会话session来实现数据的增删改查。6.2.6数据操作类 userdaopublicclassuserdao privatesessionsession = null;publicuserdao() session = hibernate.getsession();/获取会话publicuserfindbyaccount(integeraccount) /根据账号来查询用户criteriac = session.createcriteria(user.class);c.add(restrictions.eq(account, account);useruser = (user)c.uniqueresult();returnuser;/根据账号和密码来查询用户publicuserfindbyaccountandpassword(integeraccount, stringpassword) criteriac = session.createcriteria(user.class);c.add(restrictions.eq(account, account);c.add(restrictions.eq(password, password);useruser = (user)c.uniqueresult();returnuser;/查询全部用户publiclistqueryall() criteriac = session.createcriteria(user.class);suppresswarnings(unchecked)listusers = c.list();returnusers;6.2.7数据操作类 crowddaopublicclasscrowddao /群组数据访问层privatesessionsession = null;publiccrowddao() session = hibernate.getsession();publicvoidsave(crowdcrowd) /保存群组transactiontransaction = session.begintransaction();session.save(crowd);mit();publicvoidupdate(crowdcrowd) /更新群组transactiontransaction = session.begintransaction();session.update(crowd);mit();publicvoiddelete(crowdcrowd) /删除群组transactiontransaction = session.begintransaction();session.delete(crowd);mit();以上两个数据访问类都使用了基于criteria的查询方式,该方式是面向对象的,通过为该对象设置一些相应的属性值,就可以获取满足条件的数据。如:c.add(restrictions.eq(account, account)等价于whereaccount = account.从思想的层面上来讲很大程度上有别于传统的sql查询方式。hibernate还提供了封装过的save(object);update(object);delete(object)等方法供我们使用,以便提高开发效率。通过如此简单而又精炼的代码即可完成对数据的处理,极大地解放了程序员的劳动力。6.2.8表结构设计表6-1user实体类对应的表字段数据类型备注accountint账号passwordvarchar密码namevarchar昵称idint主键表6-2crowd实体类对应的表字段数据类型备注namevarchar群组名称idint主键关于用户的信息主要有两张表。一张是用户自身的信息表,该表用来存储用户的个人资料;另一张表是群组表,用来记录每个用户所拥有的群组信息。每个用户可以拥有多个群组(如:朋友、陌生人等),而每个群组又可以拥有多名用户(如:朋友列表下有张三、李四两个人)。两张表是多对多关系4。需要指明的是,在这两张表里面都没有通过外键来建立关联关系,这是因为可以通过hibernate的注解manytomany来完成关联关系的映射。hibernate在处理这个注解时,自动地去帮我们创建一张中间表,并用它来维护表之间的关联关系,这使得我们在构建表结构的时候变得异常轻松。6.2.9用户类userentitytable(name = user)publicclassuserimplementsserializable privatestaticfinallongserialversionuid = 1l;idgeneratedvalue(strategy = generationtype.auto)column(name = id, unique = true)privateintegerid;/主键column(name = account)privateintegeraccount;/账号column(name = password)privatestringpassword;/密码column(name = name)privatestringname;/昵称manytomany(mappedby = users, fetch = fetchtype.eager)privatelistcrowds = newarraylist();/用户所属的群组6.2.10群组类crowdentitytable(name = crowd)publicclasscrowdimplementsserializableprivatestaticfinallongserialversionuid = 1l;idgeneratedvalue(strategy = generationtype.auto)column(name = id)privateintegerid;/主键column(name = name)privatestringname;/群组的名称manytomany(fetch = fetchtype.eager)/(mappedby = crowds)privatelistusers = newarraylist();/群组所包含的用户publiccrowd() 1.通过entry来标明它是一个实体类。2.通过tabel(name=”tablename”)来指明该实体类与数据库中哪一张表相对应。3.通过id来指明表中的主键。4.通过generatedvalue(strategy = generationtype.auto)来指明主键的增长策略。5.通过column(name = name)来指明类中的某个属性与数据库表中哪个字段名相匹配。6.通过manytomany(fetch = fetchtype.eager)来指明两个实体类之间的多对多关系。使用了hibernate之后,作为程序员的我们完全可以使用面向对象的思维来处理数据。尤其是在hibernate的配置文件中使用了create之后,hibernamte甚至能够自动帮我们依据实体类来创建相应的表结构,我们无需再为操作数据库而苦恼。6.3客户端6.3.1client对于客户端所有的通信操作都是基于该client来完成,它是客户端的守护线程publicuseruser = null;/client所服务的用户privatemapmap = newhashmap();/用户的聊天窗体mapoverridepublicvoidrun() while(true) try messagemsg = (message)input.readobject();if(msg.gettype() = 11) /账户不存在logon.getinstance().setinfo(msg.getcontent();elseif(msg.gettype() = 12) /密码不对logon.getinstance().setinfo(msg.getcontent();elseif(msg.gettype() = 13)/可以登陆useruser = msg.getaccepter();setuser(user);logon.getinstance().setvisible(false);friend.getinstance().setname(user.getname();elseif(msg.gettype() = 14) /已登录logon.getinstance().setinfo(msg.getcontent();elseif(msg.gettype() = 20) /转发聊天消息this.getmap().get(msg.getsender().getaccount().append(msg);elseif(msg.gettype() = 40) /收到来自好友的游戏邀请friend.getinstance().requestgame(msg.getsender();elseif(msg.gettype() = 42) /好友同意开始游戏friend.getinstance().startgame(msg.getaccepter();elseif(msg.gettype() = 43) /好友拒绝来游戏邀请friend.getinstance().refusegame(msg.getsender();elseif(msg.gettype() = 44) /胜负已分,游戏中止/game.getinstance().losegame(); catch (exceptione) /异常处理 这个位于客户端的后台守护线程,接收服务器推送过来的消息。类似于虚拟服务器它也根据消息的类型,对消息进行分类处理,同时也将用户的操作封装成消息对象传递给虚拟服务器。当一个用户与多个好友进行会话时,为了方便管理与每个好友的会话,在该类中使用了一个map集合。当该类收到来自某个好友的聊天消息,在提取出消息内容后,从map中根据键值对来得到指定好友的聊天窗体,将聊天数据交给该聊天窗体进行显示。该类只是负责对数据进行收发,而数据的显示等操作,则交给上层的界面来完成。彼此各司其职,这样就实现了分层的效果。6.3.2登录界面logon图6-1 登录界面/登录界面所用到的控件privatestaticlogonlogon = newlogon();/窗体本身privatejpanelhead = newjpanel();/头部privatejlabelmin = newjlabel(newimageicon(image/min.png);/最小化privatejlabelclose = newjlabel(newimageicon(image/close.png);/关闭privatejpanelbody = newjpanel();/身体privatejlabelinfo = newjlabel();/信息提示privatejlabelaccountlabel = newjlabel(账号:);/账号标签privatejlabelpasswordlabel = newjlabel(密码:);/密码标签privatejtextfieldaccount = newjtextfield();/账号文本框privatejpasswordfieldpassword = newjpasswordfield();/密码文本框privatejbuttonlogin = newjbutton(登录);/登录按钮privatejpanelfoot = newjpanel();/尾部privatejlabelset =newjlabel(newimageicon(image/set.png);/设置登录界面使用来swing的网格包布局gridbaglayout来放置各个组件在面板jpanel中的位置。6.3.3好友界面friend图6-2 好友界面/省略了与登录界面外层布局的内容privatejpanelbody = newjpanel();/身体privatejpanelshow = newjpanel();/用户信息展示privatejlabelimg = newjlabel(newimageicon(image/me.png);/用户照片privatejpanelinfo = newjpanel();/用户的昵称、等级privatejlabelname = newjlabel();/用户昵称privatejlabellevel = newjlabel();/用户等级privatejscrollpanejsp = null;/容纳好友列表的窗体privatejtreetree = null;/用户的好友列表在好友界面中,通过遍历client传过来的用户信息user中的list来构建好友列表树jtree,这里使用了边界布局的方式来放置组件。6.3.4聊天界面chart图6-3 聊天界面privatejpanelbody = newjpanel();/身体privatejtextareaoutput = newjtextarea();/显示框privatejscrollpaneread = newjscrollpane(output);/显示框的滚动窗体privatejtextareainput = newjtextarea();/输入框privatejscrollpanewrite = newjscrollpane(input);/输入框的滚动窗体privatejpaneljp = newjpanel();/输入框的滚动窗体privatejbuttonenter = newjbutton(发送);/发送按钮privatejbuttoncancel = newjbutton(取消);/取消按钮privateuserfriend = null;/聊天的好友聊天界面中利用jtextarea来显示聊天对话的内容,当聊天内容过多时,可以拖动外层滚动面板jscrollpane提供的滚动条来翻阅查看。6.3.5游戏界面game图6-4 游戏界面在游戏界面,产生8*8=64个网格,所以需要32对按钮,其中每一对中的两个按钮都是一样的。这样就可以保证所有的按钮都会有一个与之匹配。因为在该网格中无法按位置来获取其中的按钮,所以我使用了一个二维数组来模拟网格的位置。“连连看”游戏的界面代码如下:publicclassgameextendsjframeprivatestaticfinallongserialversionuid = 1l;jmenubarjmb = null;/菜单栏jmenufile = null;/文件菜单jmenucustomize =null;/自定义菜单jmenuitemdifficulty = nu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论