• 2.16 MB
  • 29页

讯时个人通讯录_实训项目报告书

  • 29页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'实训项目报告书项目名称讯时个人通讯录年级班级2010级计101—4项目完成人杨俊南实训时间:2011年12月12日至2011年12月31日 填表说明一、本表由项目完成人填写,一式一份;二、实训结束前将填好的文稿打印后交实训指导教师进行鉴定和评定成绩,确认后的文档交院校存档保存;三、此表电子文档及学生项目实训的作品须打包存档,压缩文件包以学生学号命名,以班为单位收集,刻录光盘交院校存档; 实训项目名称讯时个人通讯录项目组成员及其分工姓名分工情况承担的主要工作杨俊南Java2D、Swing、Access用户的注册、登录、删除等功能、联系人信息的增、删、改、查等功能、联系人分组的添加、删除功能、联系人相册管理功能、联系人头像的上传功能、界面的开发及数据库管理的设计开发 一、项目背景、目的及可行性分析1.项目背景现代人的生活节奏日益加快,各种联系人也不断增多,如上司、同事、家人、朋友和同学等,但很大一部分人还是在使用普通的纸质通讯录来记录这些联系人的信息,存在如下缺陷:(1)存储信息量少,查找不方便。(2)信息容易丢失,且不能存放照片。(3)安全性不高,没有隐私性可言。为了解决上述缺陷,满足部分人的使用需求,开发出此单机版个人通讯录软件。2.项目目的为解决普通纸质通讯录的上述缺陷,现在开发一个能够大量存储信息,且易查找不易丢失信息的安全、方便、快捷的讯时个人通讯录。3.项目可行性分析:(1)技术可行性讯时个人通讯录是一款应用性很强的通讯记录软件。完成该项目覆盖的技能点有:GUI中基本组件的运用及其对应的事件监听器的处理、树状列表控件与数据库的结合使用、系统托盘的使用及其异常处理。我在接到项目后,对项目进行了仔细的分析并作出了慎重的决定,由于已学习过了java,并掌握了其基础知识,且对数据库有一定的了解,且曾经有过项目的开发经验,因此具有开发此软件的基本能力。该软件无特别复杂的功能,因此在技术上是可行的。 (2)人员可行性本人具有一定的java基础技术,具有从网络、老师及同学等渠道的学习能力,具有坚韧执着、不怕苦难的学习态度,具有能够完成的能力。(3)软件工作量此软件的软件工作量适中,涉及的功能模块复杂度、难度适中。(4)代码工作量代码量总体来讲比较适中,涉及的java类不是很多,其中登陆界面和主界面的构造器代码工作量比较大。(5)整体进度整体进度比较顺利,其中前期登陆界面和主界面的设计比较复杂及在数据库的设计理解上存在难度,使用了很多时间,后期各功能模块的实现用时适中。整个软件项目整体用时近两个星期,得以完成。 二、项目概述讯时通讯录软件是一款应用性很强的通讯通讯记录软件。软件中用户使用软件拥有自己的密码,确保通讯录资料的安全性;联系人资料丰富包括性别、电话、手机、电子邮箱、联系地址等;且用户可以添加联系人分组;可以编辑联系人信息;可以设置联系人头像、添加联系人相册等等。功能介绍如下:(1)注册/登陆/修改密码/删除用户用户需注册一个账号才能拥有该软件的使用权,用户注册后,输入用户名和密码进行校验。校验通过进入功能菜单,并且记录相应登录信息;未通过则提示非法用户或密码,需重新输入。用户还可以修改原来的密码,修改后重新登陆需用新密码,确保了用户使用的安全性。用户还可以删除原有的所有的联系人即该用户可以将自己从通讯录用户系统中清除。(2)添加/查找联系人用户可以添加联系人的编号、姓名、性别、电话、手机、邮箱、相册和设置联系人头像及所在分组等,且添加后联系人信息还可以再编辑保存,当联系人比较多时,用户可以选择是使用编号查找还是姓名查找,当联系人中有要查找的对象时显示该联系人,当没有该联系人时显示不存在该联系人,使查找联系人更方便快捷。(3)上传/删除照片用户可以选择从本地上传联系人的头像,更改联系人的头像,可以选择从本地上传联系人相册,更改删除联系人相册,更改保存后显示该联系人的头像,且排列显示联系人的相册。 (4)相册预览/相片明细用户上传的联系人相片行列排列显示在相册列表里,当鼠标滑到相片上时显示相片的名称,点击相片可放大预览相片的明细。(5)树状列表导航主功能界面右侧采用树状列表导航的布局,双击结点可打开关闭结点的分支内容,使界面内容预览更加直观方便。(6)系统托盘及退出软件运行时会在屏幕右下角产生一个系统托盘,当点击主功能的界面的关闭时,软件并不是完全退出,双击系统托盘可以快捷显示主功能界面,右击系统托盘会出现用户名、关于开发者信息和能够实现完全退出的功能。人员分配此项目由一人在两个星期内完成,所有技能点均由自己自足学习完成,所有任务功能点均由一人完成。 三、相关技术路线(1)数据库连接publicclassDButil{privatestaticStringdriver="sun.jdbc.odbc.JdbcOdbcDriver";//声明数据库连接字符串privatestaticStringurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=db/linkman.mdb";privatestaticConnectioncon=null;//声明数据库连接对象引用privatestaticjava.sql.Statementstat=null;//声明语句对象引用privatestaticPreparedStatementpsInsert=null;//声明预编译语句对象引用privatestaticResultSetrs=null;//声明结果集对象引用publicstaticConnectiongetConnection(){}publicstaticvoidcloseCon(){}}(2)登陆publicclassLoginextendsJFrameimplementsActionListener{publicLogin(){}publicvoidclear(){}publicvoidactionPerformed(ActionEvente){}publicstaticvoidmain(String[]args){}}(3)系统托盘publicclassTrayimplementsActionListener{publicTray(Stringname){if(SystemTray.isSupported()){trayIcon.addActionListener(this);}}publicstaticvoidmain(String[]args){newTray("junowin");}publicvoidactionPerformed(ActionEvente){}}(4)树结点publicclassTreeextendsJFrame{publicTree(){}publicstaticvoidmain(String[]args){}} 四、详细设计1.系统结构:2.数据库设计: 3.类图设计: 部分代码:publicclassLoginextendsJFrameimplementsActionListener{privateJFramejf=newJFrame();privateContainerct=jf.getContentPane();privateImageIconloginbg=newImageIcon("image/loginbg.jpg");privateImagelogobg=Toolkit.getDefaultToolkit().getImage("image/logobg.png");privateImagelogo=Toolkit.getDefaultToolkit().getImage("image/logo.png");privateIconiconlgbg=newImageIcon(logobg);privateIconiconlg=newImageIcon(logobg);privateJLabeljlbg=newJLabel(loginbg);privateJLabeljllg=newJLabel();privateJLabel[]jlArray={//创建标签数组newJLabel("用户名"),newJLabel("密码"),newJLabel("")};privateJButton[]jbArray={//创建按钮数组newJButton("登录"),newJButton("注册"),newJButton("修改密码"),newJButton("删除用户")};privateJTextFieldjtf=newJTextField();//填写用户名的文本框privateJPasswordFieldjpf=newJPasswordField();//填写密码的文本框publicLogin(){jf.setTitle("登录");jf.setIconImage(logo);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setResizable(false);jf.setBounds(500,300,300,250);jf.setVisible(true);jf.getLayeredPane().add(jlbg,newInteger(Integer.MIN_VALUE));jlbg.setBounds(0,0,300,250);((JPanel)ct).setOpaque(false);ct.setLayout(null);jllg.setIcon(iconlgbg);jllg.setBounds(30,20,60,80);ct.add(jllg);//用户名、密码、登录、注册for(inti=0;i<2;i++){jlArray[i].setBounds(100,20+i*50,80,26);jbArray[i].setBounds(50+i*110,120,90,26);ct.add(jlArray[i]);ct.add(jbArray[i]);jbArray[i].addActionListener(this);}//修改、删除for(inti=0;i<2;i++){jbArray[i+2].setBounds(50+i*110,160,90,26);ct.add(jbArray[i+2]);jbArray[i+2].addActionListener(this);}jtf.setBounds(150,20,120,30);ct.add(jtf);jtf.addActionListener(this);jpf.setBounds(150,70,120,30);ct.add(jpf);jpf.setEchoChar("●");//设置密码的回显字符jpf.addActionListener(this);jlArray[2].setBounds(10,190,300,30);ct.add(jlArray[2]);}publicvoidclear(){//清空输入框信息,输入焦点改为用户名框jtf.setText("");jpf.setText(""); jtf.requestFocus();}publicvoidactionPerformed(ActionEvente){//得到用户名和密码Stringuser=jtf.getText().trim();Stringpwd=String.valueOf(jpf.getPassword());Stringsql="";if(e.getSource()==jtf){//用户名到密码的焦点切换jpf.requestFocus();}elseif(e.getSource()==jbArray[0]||e.getSource()==jpf){//登陆判断if(DButil.check(user,pwd)){MainFrameminf=newMainFrame(jtf.getText());//进主窗体this.dispose();//释放登陆窗体}else{jlArray[2].setText(""+"对不起,非法的用户名和密码!");this.clear();}}elseif(e.getSource()==jbArray[1]){//注册判断if(user.equals("")||pwd.equals("")){jlArray[2].setText(""+"对不起,用户名或密码不能为空!");this.clear();}else{sql="selectuidfromuserwhereuid=""+user+""";if(DButil.isExist(sql)){//用户名已经存在jlArray[2].setText(""+"对不起,该用户名已经存在!");this.clear();}else{sql="insertintouservalues(""+user+"",""+pwd+"")";if(DButil.update(sql)>0){jlArray[2].setText(""+"恭喜您,注册成功!");}} }}elseif(e.getSource()==jbArray[2]){//修改密码if(user.equals("")||pwd.equals("")){jlArray[2].setText(""+"修改密码前请先确认输入正确的用户名和密码!");this.clear();}elseif(DButil.check(user,pwd)){Stringpassword=JOptionPane.showInputDialog(this,"修改密码","请输入新密码,并确认!",JOptionPane.PLAIN_MESSAGE);if(password==null||password.equals("")){JOptionPane.showMessageDialog(this,"密码不能为空哦","出错啦!",JOptionPane.WARNING_MESSAGE);}else{//更新密码的SQLsql="updateusersetpwd=""+password+""whereuid=""+user+""";//更新密码的SQLif(DButil.update(sql)>0){this.clear();jlArray[2].setText(""+"恭喜您,密码修改成功!请用新密码登录!");}}}else{JOptionPane.showMessageDialog(this,"用户名和密码不匹配啊!","出错啦!",JOptionPane.WARNING_MESSAGE);this.clear();}}elseif(e.getSource()==jbArray[3]){//删除用户if(DButil.check(user,pwd)){intyn=JOptionPane.showConfirmDialog(this,"真的要删除该用户吗?","删除!",JOptionPane.YES_NO_OPTION);if(yn==JOptionPane.YES_OPTION){intcount=DButil.delUser(user);jlArray[2].setText("用户"+user+"删除成功"+"共删除了"+count+"个联系人");this.clear();}} else{jlArray[2].setText(""+"对不起,密码和用户名不匹配!");this.clear();}}}publicstaticvoidmain(String[]args){newLogin();}}publicvoidactionPerformed(ActionEvente){if(e.getSource()==jba){//“添加”联系人this.isInsert=true;this.clearInfo();//清空信息面板cl.show(jpy,"Info");//显示信息面板this.setEditable(true);}elseif(e.getSource()==jbs||e.getSource()==jtfs){//“查找”联系人this.monitorSearchButton();}elseif(e.getSource()==jbInfo[4]){//“添加分组”this.monitorAddGroupButton();}elseif(e.getSource()==jbInfo[5]){//“删除分组”this.monitorDelGroupButton();}elseif(e.getSource()==jbInfo[3]){//更改照片“浏览”路径jfcPic.showOpenDialog(this);if(jfcPic.getSelectedFile()!=null){jtfInfo[7].setText(""+jfcPic.getSelectedFile());}}elseif(e.getSource()==jbInfo[6]){//添加照片“浏览”路径jfcPho.showOpenDialog(this);if(jfcPho.getSelectedFile()!=null){jtfPhoto.setText(""+jfcPho.getSelectedFile());}} elseif(e.getSource()==jbInfo[2]){//“删除”this.monitorDelButton();}elseif(e.getSource()==jbInfo[1]){//“保存”this.monitorSaveButton();}elseif(e.getSource()==jbInfo[0]){//“编辑”this.isInsert=false;this.setEditable(true);this.perNameBefor=jtfInfo[1].getText().trim();this.perGroupBefor=(String)jcb.getSelectedItem();}elseif(e.getSource()==jbInfo[7]){//“上传”this.monitorUploadButton();}elseif(e.getSource()==jbInfo[8]){//“删除”this.delPhoNode(jtfPhoto.getText().trim());}elseif(e.getSource()==trayIcon){//双击托盘,显示窗口this.show(true);}elseif(e.getSource()==currently){//显示当前登陆的用户信息trayIcon.displayMessage("信息","当前登录用户为"+uname,TrayIcon.MessageType.INFO);}elseif(e.getSource()==about){//关于JOptionPane.showMessageDialog(this,"此软件来自于junowin,欢迎您的使用","关于",JOptionPane.INFORMATION_MESSAGE);}elseif(e.getSource()==exit){//关闭System.exit(0);}} 五、项目完成情况注册成功注册失败 修改密码01修改密码02 删除用户01删除用户02添加联系人并保存 添加照片失败01添加照片失败02 添加照片选择路径树状列表显示图片 上传照片成功相册显示照片列表 查看照片明细删除照片01 按编号查找编号查找结果 按姓名查找姓名查找结果 所遇到的问题:1.在登陆界面是否可以插入背景图片,是否可以设置logo标签?解决方法:通过网上查找资料,得知容器中存在分层结构,需把背景图片放在底层,并设置透明setOpaque(false),并且采用ToolKit设置标签的图片。2.怎样才能在系统托盘中加入一个关于的提示对话框?解决方法:通过询问老师了解到PopupMenu中JoptionPane中showMessageDialog方法参数不匹配,不存在继承关系,后修改Gui中组件得以完成。3.数据库连接出错,总是出现MicrosoftAccessDriver参数类型不足,期待值为1?解决方法:通过网络帮助得知可能是由于Access建表时出错,经过重新建表,问题得以解决。4.登陆到主界面时点击添加按钮,出现异常,数据库连接不上?解决方法:仔细查看代码发现数据库的连接路径出现错误,改为privatestaticStringurl="jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=db/linkman.mdb",恢复正常。5.登陆时出现密码校验不正常,所有密码都可以登陆?解决方法:仔细查看很长时间发现一个变量spwd写错成pwd导致密码无法写入数据库,后修改好得以实现。6.上传图片时发生图片上传错误,无法显示?解决方法:查看代码发现图片的文件格式不正确,原为jpeg、gif、png没有包括jpg类型,添加后并修改数据库字段上传类型,得以解决。 六、实训收获和建议通过这短短的十几天的实训,使我对javaGUI图形用户界面,有了更深刻的了解,原本不友好的输入输出界面,开始在我的编程生涯中退出舞台,GUI图形库有着很强的函数库,可以改变绘图的环境如插入图片、自定义图标、添加友好的用户界面等众多功能。且在这次实训中我学会了怎样使用树状结点导航功能,系统托盘的开发、以及基础的数据库知识。使我在以后学习数据库时得以更加重视。各知识点总结:(1)树状列表控件的使用:本软件根据数据库里存在的联系人情况,动态生成树状列表的形状,并单击树上任何一个节点,都能达到导航的效果,添加删除联系人,编辑联系人资料,上传删除照片时,都能达到动态更新树上节点的功能。(2)卡片布局的使用:对树导航作用起显示效果的是使用了卡片布局,根据选中树上某一节点,卡片布局管面板进行不同信息面板的显示,真正实现了导航功能,希望读者通过本章的学习,能够熟练掌握卡片布局的使用。(3)流布局的使用:本软件的照片预览功能的开发中,流布局的使用使得其开发变得简单,并且达到了根据控件大小进行动态排列照片的效果,如果不使用流布局,要达到这样的效果会很麻烦,流布局平时我们不常使用,但是并不见得就没用,希望读者学会善于利用所学的知识。(4)finally的使用:本软件代码中多次在finally语句块中关闭数据库连接,这是一个非常好的习惯,因为finally是必须执行的语句,能够保证连接的关闭。 (5)系统托盘的使用:从JavaSE6.0开始Java中也支持系统托盘的开发,使用系统托盘可以使当前系统一直执行,而不影响当前的桌面。希望通过本章的学习,读者对系统托盘的开发有了一定的理解,并在实际开发中恰当的使用该功能。(6)弹出对话框的使用:本软件中填写用户信息时,需要对这些信息进行合法性验证,当用户输入不合法时,就需要用弹出对话框进行提示。在开发过程中,适当的使用弹出对话框,可以大大简化开发过程,减少许多不必要的操作。这次实训我每天都在努力的一步步发现问题、解决问题,虽然很累,很苦,但从中我也寻找了快乐与成就感,也更加坚定了我在软件这条路上走下去的信念。感谢陈亮老师长期以来的指导和监督,并感谢曾经一起帮助过我的同学们。我期待着下次实训的到来,并希望下次有更好作品提交。谢谢! 实训指导教师评语从项目小组的团队意识、合作态度、专业技能、项目完成的质量等方面评价。签字:年月日实训小组成员成绩评定姓名专业技能成绩综合表现等级注:专业技能成绩为百分制,由项目指导教师评定。综合表现等级根据学生综合表现评定,分“优、良、中、及格、不及格”五级。备注'