基于JAVA个人通讯录管理系统开发与设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
郑州科技学院
Java 课程设计报告
题 目 Java 通讯录课程设计
课 程 名 称 Java 程序设计实用教程 院 部 名 称 信息工程学院 专 业 计算机科学与技术专业 班 级 11计科1班 学 生 姓 名 胡燊 学 号 201115007 指 导 教 师 杜 远 坤 完 成 时 间 2013年12月20日
摘要
本文介绍了一个简单实用的个人通讯录管理系统java工程,详细描述了本人在编程时候的编程思想和在MyEclipse 中调试运行的步骤,简明扼要地介绍了整个工程的功能和实用方法。
这个个人通讯录管理系统含有添加、删除、查找等基本功能,同时也添加了一些有趣的小功能——支持背景图片的更换。
在程序中完成了与数据库的通信,并同样可以对数据库进行添加、查找、删除等功能。
关键词:个人通讯录管理系统、添加、删除、查找、数据库
2
目录
摘要 (2)
1 绪论 (4)
1.1 设计目的 (4)
1.2 设计内容 (4)
2 程序要求 (4)
3 算法分析 (5)
3.1 程序总体设计思想 (5)
3.2 程序设计总体框图 (5)
3.3 程序详细设计 (6)
4 调试过程 (8)
5 体会 (16)
6 参考文献 (17)
附录(源程序) (18)
3
1 绪论
1.1 设计目的
本课程设计是java语言学习中很重要的实践性环节之一,是在学习完java课程后进行的一次全面的综合练习旨在巩固和加深我们对java语言的基本知识的理解和掌握,掌握java语言编程和程序调试的基本技能,利用java语言进行基本的软件设计,掌握书写程序设计说明文档的能力,提高运用java语言解决实际问题的能力。
1.2 设计内容
在设计一个完整的系统中,我从系统的管理员登录界面开始做,另外依据相关要求,对系统增加了数据库支持(Microsoft Access做的数据库),还有对数据库里的数据进行增加、删除、显示所有记录、查询记录、导出备份数据库文件。
另外为了界面美观,增加了系统主界面背景界面图片的支持。
为了保证数据库的安全,在系统中设立了管理员权限,即只有被允许的用户才可以进入该系统。
2 程序要求
设计一个通讯录管理软件,要求如下:
增加记录、删除记录、显示所有记录、查询记录、文件备份、退出。
通讯录记录信息包括:姓名,电话,email等。
(1)通讯录的每一条信息包括姓名,单位,电话!(可用数组或数据库);
(2)输入功能:可以一次完成若干条信息的输入;
(3)显示功能:完成全部通讯录信息的显示(一屏最多显示10条,超过十条应能够自动分屏显示);
(4)查找功能:完成按姓名查找通讯信息;
(5)删除功能:完成按姓名删除通讯信息;
(6)应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!
4
3 算法分析
3.1 程序总体设计思想
个人通讯录件的功能模块有:
(1)提供登陆界面,方便用户进入,满足需求;
(2)添加:可以添加通讯录记录,依次输入姓名、性别、出生日期、移动电话、固定电话、MSN/QQ、公司地址、E-Mail地址、家庭住址、组别、备注后,会提示是否继续添加;
(3)显示:可以以表格形式输出所有通讯录里的记录;
(4)查询:可以用姓名查询;
(5)修改:输入欲修改的那个人的名字后,再依次输入姓名、性别、出生日期、移动电话、固定电话、MSN/QQ、公司地址、E-Mail地址、家庭住址、组别、备注即可完成修改;
(6)删除:可以直接删除多余的通讯录记录;
(7)帮助:可以在帮助里面修改用户密码;
(8)导出数据库:可以将数据库以文本txt格式导出。
程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。
3.2 程序设计总体框图
个人通讯录管理系统设计的总体框图如图3-1:
5
图3-1 个人通讯录管理系统设计的总体框图
3.3 程序详细设计
该程序共有18个类,也分别创建了18个java源程序文件,以下按照文件名字母排序先后解释(在设计软件MyEclipse工程排序也是如此),另外在此只是简要介绍相关源程序所实现的功能,程序截图参见调试,源程序参见附录:
Demonstrationaction.java文件做的是功能表中“编辑—查找全部”的功能,使用此项功能的时候,在点击“显示查询结果”后,让界面显示出全部数据库中的内容;点击“退出全部查询”的时候退出该功能。
Demonstrationframe.java文件做的就是“编辑—查找全部”的界面,上面有标题、文6
字显示框和两个控制按钮——“显示查询结果”和“退出全部查询”。
Dlframe.java文件做的是“编辑—删除”的界面,有一个文字输入框(提供按名字来删除),和两个控制按钮——“删除”和“放弃”。
Dlframeaction.java文件做的是“编辑—删除”的相关功能,当输入名字之后会进行查找删除,若在数据库中含有当前名字的数据则删除该条数据并显示“删除成功”,否则显示“未找到该项”。
点击“放弃”即退出删除功能。
Fdframe.java文件做的是“编辑—查询”的界面,提供按名字搜索,有一个文字输入框,和两个控制按钮——“查询”和“撤销”。
Fdframeaction.java文件做的是“编辑—查询”的相关功能,输入需要查询的姓名之后,如若在数据库中有符合的数据后,则显示查询结果,并弹窗显示“查询结束”;如若没有对应的数据,则弹窗显示“没有记录”。
点击“撤销”则退出查询功能。
Fdkeep.java文件做的是“文件—导出数据库”的界面,有一个文字输入框提供输入导出的数据库的完整路径,两个控制按钮——“save”和“give up”。
Fdkeepaction.java文件做的是“文件—导出数据库”的相关功能,输入了完整路径之后,会启动Microsoft Office Access导出数据库;如若路径错误,则会弹窗显示“路径错误!”。
点击“give up”后则退出界面。
Frameaction.java文件做的是主界面的相关功能选择。
主界面有三个大选项,文件、编辑和帮助。
其中文件包括导入数据库和退出,编辑包括删除、添加、按姓名查找和查找全部,帮助则是修改管理员密码。
Image.java文件是使主界面支持背景图片的切换,使用的是工程文件夹Images下的U.jpg。
支持任意大小的图片。
Loginframe.java文件做的是主界面的登录界面。
即在程序以java Application运行后需要进行用户登录的界面,提供用户名和密码的文本输入框和两个控制按钮——“certain”和“cancel”。
LoginIn.java文件做的是登录界面的相关功能,对输入的用户名与密码和数据库进行匹配,如若正确则弹窗显示“登录成功”,否则弹窗显示“用户名或密码错误”。
Myaddress.java文件做的是定义了一个公共类Myaddress,并定义了主函数是调用这个Myaddress的公共类。
Panelframe.java文件做的是“编辑—添加”的界面,提供给用户向数据库添加新数据,有对于姓名、性别、出生日期、移动电话、固定电话、MSN/QQ、公司地址、E-Mail 地址、家庭住址、组别、备注等信息录入的文本输入框。
以及最后的两个控制按钮——
7
“保存”和“取消”。
Panelframeaction.java文件做的是“编辑—添加”的相关功能。
在界面中输入相关信息后,点击保存则系统向数据库存入信息,点击取消则将信息丢弃。
同时还确保信息的相关性,例如控制了出生日期是使用了日期控件的使用等等。
Revisionmovement.java文件做的是“帮助—修改密码”的相关功能。
首先验证用户输入的原始密码是否正确,然后接受用户输入的6位以上的新密码,存入数据库并修改密码信息。
Revisionpassword.java文件做的是“帮助—修改密码”的界面。
界面包括两个旧密码和新密码的文本输入框,和两个控制按钮——“保存”和“取消”。
Year.java文件做的是在出生日期里面的日期控件,对平年闰年的区分,然后对各个月不同日期做了相关定义。
4 调试过程
调试是一耳光程序员最基本的技能,其重要性甚至超过学习一门语言。
不会调试的程序员就意味着他即使会一门语言,却不能编写出任何好的软件。
这是当初我最开始接触C语言的时候让我感受很深的一句话,我当时很不能理解如果调试真的这么重要,为什么在我们的课本里面却找不到相关的内容,甚至一些相当经典的教材里面也没有对其进行大篇幅的介绍。
直到自己开始写了一些大一点的程序,才发现有时候自己最初设计程序在一些细节上的新颖想法是那么的可笑,带来的只是无穷无尽的错误和威胁。
程序编写完成就应该调试自己所完成的程序,以减少程序中的bug。
以下是我的程序调试以及运行过程截图。
说明:本程序的运行环境是MyEclipse 6.5,经验证在Eclipse中运行会产生错误“Column not Found”,但是最开始我是在MyEclipse中完成的程序,我也就没有去就针对Eclipse进行更改,Linux的环境虚拟机我没有安装,所以不知道在虚拟机Linux下是否能够正常运行。
打开MyEclipse 6.5软件,导入Workspace,如图4-1:
8
图4-1 编程环境截图
右键点击工程,选择“Run as—Java Application”,成功运行,出现用户登录界面,输入用户名“wj”,密码“123”,如图4-2:
图4-2 个人通讯录登入界面
点击“certain”,登录成功,点击确定,进入个人通讯录管理系统,如图4-3:
9
图4-3 个人通讯录管理系统主界面
点击左上角的“文件—导出数据库”,如图4-4:
图4-4 导出数据库
输入完整路径之后点击“save”就可以以文本格式保存数据库,例如我们就按照提示输入路径,则数据库的备份文件如图4-5:
10
图4-5 保存的数据库文件
点击“文件—退出”则退出了个人通讯录管理系统。
接下来是对数据库进行添加、编辑、查找、删除等功能。
故先看看数据库的原文件。
注:本数据库是由Microsoft Office Access 2007创建,如若计算机里面没有Access,编译环境会对Access驱动的设置报错!数据库如图4-6:
图4-6 原始数据库
选择“编辑—添加”对数据库进行添加操作。
输入如下信息,如图4-7:
图4-7 信息添加界面
点击“保存”将新加的信息加入数据库,系统会告知“添加成功”。
如图4-8:
图 4-8 系统信息添加界面
重新查看数据库,可以发现新添加的信息已经加入了数据库。
如图4-9:
图4-9 添加信息后的数据库部分截图
由上面操作可以知道,添加功能正常。
选择“编辑—删除”,按照提示输入删除的用户名,如图4-10,就假设我们删除刚才添加的信息:
图4-10 删除记录
点击“删除”后,则系统会提示“删除成功”,如图4-11:
图4-11 删除成功
重新查看数据库,发现刚才添加的信息已经被成功删除,如图4-12:
图4-12 成功删除后的数据库
通过以上的删除操作可以知道,系统的删除功能也是可以正常运行的。
点击“文件—按姓名查找”,输入所需要查找的用户名,如图4-13:
图4-13 查找记录
点击“查询”,系统会对数据库进行查找,并提示“查找结束”,如图4-14:
图4-14 查找结束
并会弹窗显示所查找的结果,如图4-15:
图4-15 查找结果
以上步骤只能说明是正确输入了数据库中包含的数据,如若数据库中未含有被查找的内容,则系统也应该做出正确的反应。
如图4-16,查找数据库中没有的信息:
图4-16 输入数据库中没有的用户名
点击“查询”之后,则系统提示“没有记录”,如图4-17:
图4-17 查找错误的消息提示
以上通过了正确查找和错误两方面充分论证了查找功能的正常运行。
点击文件“编辑—查找全部”,则会弹出一个空白的查找结果界面,这是因为在程序设计中默认的是不显示所得的信息,如图4-18:
图4-18 查找全部界面
然后点击“显示查询结果”,即可显示出全部查询结果。
如图4-19:
图4-19 查找全部结果
另外本系统还有一个功能,更改当前用户的密码。
点击“帮助—修改密码”,显示修改密码界面,如图4-20:
图4-20 修改密码界面
分别输入当前的旧密码和所更改的新密码,如图4-21:
图4-21 输入旧密码和新密码
点击“保存”即可成功修改密码,并可以修改数据库。
如图4-22:
图4-22 密码修改成功消息
查看数据库中的表userpass,新密码已经更改成功,如图4-23:
图4-23 数据库中的新密码显示
另外需要注意的是,修改的新密码是需要该系统重启生效。
即退出后重新运行该工程才能使新密码生效。
至此,个人通讯录管理系统的调试运行全部完成。
5 体会
这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。
自己动手,自己发现和解决问题。
发现了自己的许多不足。
平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部
分问题,当然还存在一些问题没有解决。
我相信在以后的学习能够解决好它们。
但是,收获还是不小的,我不仅对Java的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
6 参考文献
[1] 王克宏. Java技术教程(基础篇).清华人学出版社,2002
[2] 古大龙. 软件开发的形式化方法.高等教育出版社,2005
[3]陈强. Java程序设计.北京:人民邮电出版社,2001
[4]侯捷. Java编程思想.第2版.北京:机械工业出版社,2002
[5]Herbert Schildt. Java2参考大全.北京:清华大学出版社,2002
[6] 谭浩强.sql Sever2000数据库实训教程,清华大学出版社,2007
[7] 王珊、萨师煊.数据库系统概论,高等教育出版社,2006
附录(源程序)
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class contacts {
int conNum;
String name;
String tel;
String QQ;
String email;
String address;
public contacts()
{ }
public contacts(int conNum)
{
this.conNum = conNum;
}
public contacts(int conNum, String name, String tel, String QQ,String email,String address)
{
this.conNum = conNum;
= name;
this.tel = tel;
this.QQ = QQ;
this.email = email;
this.address = address;
}
public int getconNum()
{
return conNum;
}
public void setconNum(int conNum) {
this.conNum = conNum;
}
public String getName()
{
return name;
}
public void setName(String name) {
= name;
}
public String getTel()
{
return tel;
}
public void setTel(String tel)
{
this.tel =tel;
}
public void setQQ(String QQ)
{
this.QQ=QQ;
}
public String getQQ()
{
return QQ;
}
public void setEmail(String email)
{
this.email= email;
}
public String getEmail()
{
return email;
}
public void setAddress(String address)
{
this.address= address;
}
public String getAddress()
{
return address;
}
//向数据库中插入联系人基本信息,若插入成功返回true
public boolean insertcontacts()
{
boolean b = true;
try
{
Connection con = SqlConnection.getCon();
Statement statement = con.createStatement();
String sql = "insert into contacts values('" + conNum + "','" + name
+ "','" + tel + "','" + QQ + "','" +email+ "','" +address+ "')";
//sql = new String(sql.getBytes("GB2312"), "ISO8859_1"); //处理汉字乱码
statement.executeUpdate(sql);
statement.close();
con.close();
}
catch (Exception e)
{
b = false;
System.out.println("插入数据遇到异常!");
}
return b;
}
//根据序号查询基本信息,若查询成功返回true
public boolean selectByconNum(String conNum) throws Exception
{
boolean b = false;
Connection con = SqlConnection.getCon();
Statement statement = con.createStatement();
String sql = "select * from contacts where sconNum = '" + conNum + "'";
ResultSet rs = statement.executeQuery(sql);
if (rs.next())
{
int no = rs.getInt(1);
this.setconNum(no);
String n = rs.getString(2);
//n = new String(n.getBytes("ISO8859_1"), "GBK");
this.setName(n);
String t = rs.getString(3);
//g = new String(g.getBytes("ISO8859_1"), "GBK");
this.setTel(t);
String q = rs.getString(4);
this.setQQ(q);
String e = rs.getString(5);
this.setEmail(e);
String a = rs.getString(6);
this.setAddress(a);
b = true;
}
rs.close();
statement.close();
con.close();
return b;
}
public boolean delete(String conNum)
{boolean b = true;
try{
Connection con = SqlConnection.getCon();
Statement statement = con.createStatement();
String sql = "delete from contacts where sconNum='"+conNum+"'";
statement.executeUpdate(sql);
statement.close();
con.close();
}
catch (Exception e)
{
b = false;
System.out.println("删除遇到异常!");
}
return b;
}
public boolean paixu()
{
boolean b =true;
try
{
Connection con = SqlConnection.getCon();
Statement statement = con.createStatement();
String sql = "select * from contacts order by sconNum";
ResultSet rs = statement.executeQuery(sql);
ArrayList<String> list1=new ArrayList<String>();
ArrayList<String> list2=new ArrayList<String>();
ArrayList<String> list3=new ArrayList<String>();
ArrayList<String> list4=new ArrayList<String>();
ArrayList<String> list5=new ArrayList<String>();
ArrayList<String> list6=new ArrayList<String>();
while (rs.next())
{
list1.add(rs.getString(1));
list2.add(rs.getString(2));
list3.add(rs.getString(3));
list4.add(rs.getString(4));
list5.add(rs.getString(5));
list6.add(rs.getString(6));
}
String[] arr1=new String[list1.size()];
String[] arr2=new String[list2.size()];
String[] arr3=new String[list3.size()];
String[] arr4=new String[list4.size()];
String[] arr5=new String[list5.size()]; String[] arr6=new String[list6.size()];
if(list1 != null && list1.size()>0)
{
arr1=new String[list1.size()];
for(int i=0;i<list1.size();i++)
{
arr1[i]=list1.get(i);
}
}
if(list2 != null && list2.size()>0)
{
arr2=new String[list2.size()];
for(int i=0;i<list2.size();i++)
{
arr2[i]=list2.get(i);
}
}
if(list3 != null && list3.size()>0)
{
arr3=new String[list3.size()];
for(int i=0;i<list3.size();i++)
{
arr3[i]=list3.get(i);
}
}
if(list4 != null && list4.size()>0)
{
arr4=new String[list4.size()];
for(int i=0;i<list4.size();i++)
{
arr4[i]=list4.get(i);
}
}
if(list5 != null && list5.size()>0)
{
arr5=new String[list5.size()];
for(int i=0;i<list5.size();i++)
{
arr5[i]=list5.get(i);
}
}
if(list6 != null && list6.size()>0)
{
arr6=new String[list6.size()];
for(int i=0;i<list6.size();i++)
{
arr6[i]=list6.get(i);
}
}
for(int i=0;i<6;i++)
{
System.out.print(arr1[i]);
System.out.print(" ");
System.out.print(arr2[i]);
System.out.print(" ");
System.out.print(arr3[i]);
System.out.print(" ");
System.out.print(arr4[i]);
System.out.print(" ");
System.out.print(arr5[i]);
System.out.print(" ");
System.out.print(arr6[i]);
System.out.println();
}}
catch (Exception e) {
e.printStackTrace();
}
return b;
}
}
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.*;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
public class MainFrame extends JFrame implements ActionListener { InsertPanel ip = null;
SelectPanel sp = null;
DeletePanel hp = null;
Px pai=null;
JPanel pframe;
JButton jb1,jb2,jb3;
JMenuItem jm11,jm21, jm22,jm23, jm24,jm31, jm32,jm41,jm42; CardLayout clayout;
MainFrame(String s){
super(s);
JMenuBar mb = new JMenuBar();
this.setJMenuBar(mb);
JMenu m1 = new JMenu("系统");
JMenu m2 = new JMenu("联系人信息");
JMenu m3 = new JMenu("排序显示");
mb.add(m1);
mb.add(m2);
mb.add(m3);
jm11 = new JMenuItem("退出系统");
jm21 = new JMenuItem("输入");
jm22 = new JMenuItem("查询");
jm24 = new JMenuItem("删除");
jm23 = new JMenuItem("排序");
m1.add(jm11);
m2.add(jm21);
m2.add(jm22);
m2.add(jm24);
m3.add(jm23);
Icon i1 = new ImageIcon("save.gif");
Icon i2 = new ImageIcon("select.gif");
Icon i3 = new ImageIcon("exit.gif");
jm11.addActionListener(this);
jm21.addActionListener(this);
jm22.addActionListener(this);
jm24.addActionListener(this);
jm23.addActionListener(this);
clayout = new CardLayout();
pframe = new JPanel(clayout); //pframe存放各模块界面,CardLayout布局add(pframe); //pframe加载到框架窗口的中区
//定义软件系统的初始图形界面
JPanel mainp = new JPanel(new BorderLayout());
JLabel mainl = new JLabel("通讯录管理系统",SwingConstants.CENTER);
mainl.setFont(new Font("Serif",Font.BOLD,30));
mainp.add(mainl);
pframe.add(mainp,"main");
clayout.show(pframe, "main");
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jm21|e.getSource()==jb1){
if(ip == null) { //如果插入界面ip不存在,创建这个对象
ip = new InsertPanel();
pframe.add(ip,"insert");
}
//如果输入界面ip已经存在,就不需要创建了
clayout.show(pframe, "insert");
this.setTitle("输入联系人信息");
}
else if(e.getSource()==jm22|e.getSource()==jb2){
if(sp == null) { //如果查询界面sp不存在,创建这个对象sp = new SelectPanel();
pframe.add(sp,"select");
}
//如果查询界面sp已经存在,就不需要创建了
clayout.show(pframe, "select");
this.setTitle("查询联系人信息");
}
else if(e.getSource()==jm23)
{
if(pai==null)
{pai = new Px();
pframe.add(pai,"Px");}
clayout.show(pframe, "Px");
this.setTitle("排序显示");
}
else if(e.getSource()==jm24)
{if(hp == null) {
hp = new DeletePanel();
pframe.add(hp,"delete");
}
clayout.show(pframe, "delete");
this.setTitle("删除联系人信息");
}
else if((e.getSource()==jm11)|(e.getSource()==jb3))
System.exit(0);
}
}
import javax.swing.JFrame;
public class MainTest {
public static void main(String[] args) {
MainFrame f = new MainFrame("通讯录管理系统");
f.setSize(400, 300);
f.setLocation(350, 250);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);}
}
import java.sql.Connection;
import java.sql.DriverManager;
public class SqlConnection {
static Connection getCon()
{
Connection con = null;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //安装驱动器类
con = DriverManager.getConnection("jdbc:odbc:javajjn");//建立连接}
catch(Exception e)
{
System.out.println("建立数据库连接遇到异常!");
}
return con;
}
}
31。