学院 | *学院 | 专 业 | ******* | |
学生姓名 | 班级学号 | ******* | ||
课程名称 | Java语言程序设计 | |||
课程设计(论文)题目 | 员工信息管理系统 | |||
设计目的: 1)复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握; 2)课程设计为学生提供了一个既动手又动脑,实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力; 3)培养学生在项目开发中的团队合作精神、创新意识及能力。 设计要求(技术参数): 1)对系统进行需求分析及可行性分析 系统实现的目的,项目开发的背景,系统要达到的目标,开发系统所用的开发环境,预期使用的用户等。 2)对系统进行总体设计 分析系统的功能结构模块,并给出系统的功能结构图,设计要符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理。 3)详细设计 设计所需的数据表,给出所需数据表的字段名称,数据类型,字符长度,字段说明,约束条件。编码实现每个子功能模块,并进行测试。 计划与进度安排: 周一 全天:设计解决问题方法 周四1~4节:调试程序 周一 全天:调试程序 周四1~4节:完成论文,答辩 | ||||
成绩: 指导教师(签字): 年月日 | 专业负责人(签字): 年月日 | |||
主管院长(签字): 年月日 |
Java语言是当前最为流行的程序设计语言之一,诸多优秀的的特性使其成为被业界广泛认可和采用的工具。
随着目前公司规模的渐渐扩大,员工管理将成为意见不得不总是的问题。有些公司人员流动较大,而且人数动辄上百人,若采用传统的方式进行管理,不仅易出错更是一件令人痛疼的事。随着计算机的诞生,在此领域产生众多的信息管理系统来管理信息,不仅信息处理方便,而且简单强大。本系统正事其中的一项,针对员工信息管理,方便公司对员工的信息进行处理,极大减少了人事管理的工作量。另一方面,本系统中所涉及到图形用户界面设计是我们学习程序设计这门课的难点兼重点,通过审计本系统不仅巩固了我们的基础,以及程序设计能力,还锻炼了我们对程序设计的流程及大体上的把握不仅如此,在设计过程中,我们的调试能力也得到增强。使我们对设计“大程序”有了经验。目前,无论是机关、事业单位、还是企业单位,员工管理对于组织生存与长远发展所具备的重要性都已经有了明确的认识,而员工管理水平的提升不仅需要高素质的管理人员,而且也需要信息化工具进行辅助.在现代化的企业管理中,员工管理系统有着十分重要的作用!
关键词:文件和流 界面设计GUI 异常处理 Hashtable类
一、设计目的
随着现代社会的快速发展,我们已进入信息化时代,管理系统在人们的生活中的应用越来越广泛,它已深入到我们工作、学习、生活的各个方面。为了适应时代的发展,本次课程设计的主要任务是设计一个学生员工系统并完成一些基本操作。其目的是:
(1)提高员工信息管理的运作效率,通过对雇员全面的信息采集和处理;
(2)运用已学的java知识编一些简单使用的程序,使我们初步具备综合运用所学Java语言基础知识,面向对象程序设计的基本思想、方法与技术;
(3)由计算机来代替人工执行一系列诸如增加新员工、删除、修改、查询、显示等操作。这样就使管理人员轻松快捷的完成员工信息的管理工作。
二、设计问题
2.1 课设问题: 员工管理系统
要求完成:
(1) 完成员工的添加、删除、查询、修改功能
(2) 使用界面操作
(3) 使用文件完成
2.2 设计思路:首先设计面板,然后往面板里添加组件,点击各个组件来实现要求的对员工信息的添加、删除、查询、修改功能。
三、概要设计
3.1 程序功能模块设计的实现
本段代码中主要的类有EmployeeManager和ActionEvent,设置了监听接口由ActionEvent类来实现,并且用if语句来为变量服务。后面设置了一个异常处理,使用try和catch来捕获异常。使用GUI技术实现员工的图形界面。
3.2 系统总体结构
系统总体结构
3.3 员工信息面板功能的实现
首先构造两个面板(JPanel),分别为界面以及显示,并将其加入到容器中.
主界面
显示界面
3.4 员工界面功能模块设计的实现
录入:提示员工信息是否被录入,选择是(Y),则员工信息录入到文件中
查询:在主界面中输入员工号,点击查找,若员工信息不存在则显示如图
若文本文件中存在所要查找的员工信息(例如工号0801),则在主界面中显示该员工信息(员工号、姓名和性别)
删除:在主界面中输入员工号,点击删除按钮,弹出对话框,选择是(Y)程序将删除词员工的所有信息。
四、详细设计
4.1 定义程序变量
自定义employee类,其中定义number,name,sex三个变量,分别包含setNumber 、getNumber 、setName 、getName、 setSex 、getSex方法。
class employee implements java.io.Serializable{
String number,name,sex;
public employee(){};
public void setNumber(String number){ this.number=number;}
public String getNumber(){ return number;}
public void setName(String name){ this.name=name;}
public String getName(){ return name;}
public void setSex(String sex){ this.sex=sex;}
Public String getSex (){ return sex;}
}
4.2 程序面板设计
定义EmployeeManager类继承JFrame,使用JLabel、JTextField、JRadioBUtton、ButtonGroup、JButton等类构造各组件,使用。使用Hashtable类创建散列表对象“员工表”存放employee对象,每个employee对象用该对象的学号作为关键字。使用exists()方法判断文本文件是否存在。若存在则进行数据的写入操作。使用addActionListener()方法对JButton进行注册监听。GridLayout布局管理器对面板进行设计如下所示。
public class EmployeeManager extends JFrame{
JLabel lb=new JLabel("录入请先输入记录,查询、删除请先输入工号,修改是对查询" + "内容改后的保存!");
JTextField 工号,姓名;
JRadioButton 男,女;
ButtonGroup group=null;
JButton 录入,查询,删除,修改,显示;
JPanel a,b,c,d,f;
employee 员工=null;
Hashtable 员工表=null;
File file=null;
FileInputStream inOne=null;
ObjectInputStream inTwo=null;
FileOutputStream outOne=null;
ObjectOutputStream outTwo=null;
public employee 工人;
public EmployeeManager(){
super("沈阳理工员工基本信息管理系统");
工号=new JTextField(10);
姓名=new JTextField(10);
group=new ButtonGroup();
男=new JRadioButton("男",true);
女=new JRadioButton("女",false);
group.add(男);
group.add(女);
录入=new JButton("录入");
查询=new JButton("查询");
删除=new JButton("删除");
修改=new JButton("修改");
显示=new JButton("显示");
录入.addActionListener(new LRAct());
查询.addActionListener(new CXAct());
修改.addActionListener(new XGAct());
删除.addActionListener(new SCAct());
显示.addActionListener(new XSAct());
修改.setEnabled(false);
a=new JPanel();
a.add(new JLabel("工号:",JLabel.CENTER));
a.add(工号);
b=new JPanel();
b.add(new JLabel("姓名:",JLabel.CENTER));
b.add(姓名);
c=new JPanel();
c.add(new JLabel("性别:",JLabel.CENTER));
c.add(男);
c.add(女);
d=new JPanel();
d.setLayout(new GridLayout(6,1));
d.add(a);
d.add(b);
d.add(c);
f=new JPanel();
f.add(录入);
f.add(查询);
f.add(修改);
f.add(删除);
f.add(显示);
file=new File("员工信息.txt");
Hashtable 员工表=new Hashtable();
if(!file.exists()){
try{
FileOutputStream out=new FileOutputStream(file);
ObjectOutputStream objectOut=new ObjectOutputStream(out);
objectOut.writeObject(员工表);
objectOut.close();
out.close();
}
catch(IOException e){}
}
Container con=getContentPane();
con.setLayout(new BorderLayout());
con.add(lb, BorderLayout.NORTH);
con.add(d, BorderLayout.CENTER);
con.add(f, BorderLayout.SOUTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(200,200,600,300);
setVisible(true);
}
4.3 录入员工信息
以员工的员工号作为关键字,调用ObjectInputStream(new FileInputStream ())中的readObject()方法读取文本文件中的数据。使用员工表.containsKey(number)对关键字进行检测,如果数据中包含该员工号,则弹出对话框提示该员工信息已存在,请到修改页面进行信息的修改,如果数据中不包含该关键字,则弹出确认对话框,点击确定,程序调用put()方法写入信息到散列表中。调用writeObject()方法将散列表写入文本文件中。如果程序在获取员工号时为空时,提示用户输入员工号。用try,catch对异常进行处理。以下为具体代码:
class LRAct implements ActionListener{
public void actionPerformed(ActionEvent e){
修改.setEnabled(false);//功能尚未实现
String number="";
number=工号.getText();
if(number.length()>0){
try{
inTwo=new ObjectInputStream(new FileInputStream(file));
员工表=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
}
catch(Exception ee){System.out.println("创建表出现问题!");}
if(员工表.containsKey(number)){
String warning="该员工信息已存在,请到修改页面修改!";
JOptionPane.showMessageDialog(null,warning,"警告",
JOptionPane.WARNING_MESSAGE);
}
else{
String m="确定该员工被录入?";
int ok=JOptionPane.showConfirmDialog(null,m,"确认",
JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
if(ok==JOptionPane.YES_OPTION){
String name=姓名.getText();
String sex=null;
if(男.isSelected()){sex=男.getText();}
else{sex=女.getText();}
员工=new employee();
员工.setNumber(number);
员工.setName(name);
员工.setSex(sex);
try{
outOne=new FileOutputStream(file);
outTwo=new ObjectOutputStream(outOne);
员工表.put(number,员工);
outTwo.writeObject(员工表);
outTwo.close();
outOne.close();
}
catch(Exception ee){System.out.println("输出出现问题!");}
工号.setText(null);
姓名.setText(null);
}
}
}
else{
String warning="必须输入工号!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
}
4.4 查询员工信息
构造CXAct类实现ActionListener接口,对事件监听。在该类中以员工的员工号作为关键字,调用ObjectInputStream(new FileInputStream ())中的readObject()方法读取文本文件中的数据。使用员工表.containsKey(number)
对关键字进行检测,如果文本框中的员工号和文本文件中的数据相同,程序调用setText()方法把散列表中的员工信息显示在文本框中,如果文本框中的员工号和文本文件中的数据不相同,则程序调用JOptionPane.showMessageDialog()方法提示该员工信息不存在。如果程序获取到员工号文本框中的内容为空,则提示用户输入员工号。以下程序实现为代码:
class CXAct implements ActionListener{
public void actionPerformed(ActionEvent e){
String number="";
number=工号.getText();
if(number.length()>0){
try{
inOne=new FileInputStream(file);
inTwo=new ObjectInputStream(inOne);
员工表=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
}
catch(Exception ee){System.out.println("员工表有问题!");}
if(员工表.containsKey(number)){
修改.setEnabled(true);
employee stu=(employee)员工表.get(number);
姓名.setText(stu.getName());
if(stu.getSex().equals("男")){男.setSelected(true);}
else{女.setSelected(true);}
}
else{
修改.setEnabled(false);
String warning="该员工不存在!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
else{
修改.setEnabled(false);
String warning="必须输入工号!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
}
class XGAct implements ActionListener{
public void actionPerformed(ActionEvent e){
String number=工号.getText();
String name=姓名.getText();
String sex=null;
if(男.isSelected()){sex=男.getText();}
else{sex=女.getText();}
employee 员工=new employee();
员工.setNumber(number);
员工.setName(name);
员工.setSex(sex);
try{
outOne=new FileOutputStream(file);
outTwo=new ObjectOutputStream(outOne);
员工表.put(number,员工);
outTwo.writeObject(员工表);
outTwo.close();
outOne.close();
工号.setText(null);
姓名.setText(null);
}
catch(Exception ee){
System.out.println("录入修改出现异常!");
修改.setEnabled(false);
}
}
}
class SCAct implements ActionListener{
public void actionPerformed(ActionEvent e){
修改.setEnabled(false);
String number=工号.getText();
if(number.length()>0){
try{
inTwo=new ObjectInputStream(new FileInputStream(file));
员工表=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
}
catch(Exception ee){}
if(员工表.containsKey(number)){
employee stu=(employee)员工表.get(number);
姓名.setText(stu.getName());
if(stu.getSex().equals("男")){男.setSelected(true);}
else{女.setSelected(true);}
}
String m="确定要删除该员工的记录吗?";
int ok=JOptionPane.showConfirmDialog(null,m,"确认",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if(ok==JOptionPane.YES_OPTION){
员工表.remove(number);
try{
outOne=new FileOutputStream(file);
outTwo=new ObjectOutputStream(outOne);
outTwo.writeObject(员工表);
outTwo.close();
outOne.close();
工号.setText(null);
姓名.setText(null);
}
catch(Exception ee){System.out.println(ee);}
}
else if(ok==JOptionPane.NO_OPTION){
工号.setText(null);
姓名.setText(null);
}
else{
String warning="该号不存在!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
else{
String warning="必须输入工号!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
}
4.5 修改员工信息
和添加员工信息方法类似,定义number、name、sex三个局部变量,并使用getText()方法初始化变量。调用isSelected()方法设置单选按钮。创建employee类型的“员工”局部变量,调用Hastable类中的put()方法将要修改的员工信息写入到散列表“员工表” 中。调用ObjectInputStream(new FileInputStream ())中的writeObject()把散列表中的数据信息写入到文本文件中。使用try{}catch来捕获异常,并进行处理。以下是程序实现修改功能的代码:
class XGAct implements ActionListener{
public void actionPerformed(ActionEvent e){
String number=工号.getText();
String name=姓名.getText();
String sex=null;
if(男.isSelected()){sex=男.getText();}
else{sex=女.getText();}
employee 员工=new employee();
员工.setNumber(number);
员工.setName(name);
员工.setSex(sex);
try{
outOne=new FileOutputStream(file);
outTwo=new ObjectOutputStream(outOne);
员工表.put(number,员工);
outTwo.writeObject(员工表);
outTwo.close();
outOne.close();
工号.setText(null);
姓名.setText(null);
}
catch(Exception ee){
System.out.println("录入修改出现异常!");
修改.setEnabled(false);
}
}
}
4.6 删除员工信息
构造SCAct类实现ActionListener接口,在该类中也是以员工信息中的员工号作为关键字,调用ObjectInputStream(new FileInputStream ())中的readObject()方法读取文本文件中的数据。使用员工表.containsKey(number)
对关键字进行检测,如果文本框中的员工号和文本文件中的数据相同,程序调用remove()方法把散列表中的该项员工的信息删除,如果文本框中的员工号和文本文件中的数据不相同,则程序调用JOptionPane.showMessageDialog()方法提示该员工信息不存在。如果程序获取到员工号文本框中的内容为空,则提示用户输入员工号。以下程序实现为代码:
class SCAct implements ActionListener{
public void actionPerformed(ActionEvent e){
修改.setEnabled(false);
String number=工号.getText();
if(number.length()>0){
try{
inTwo=new ObjectInputStream(new FileInputStream(file));
员工表=(Hashtable)inTwo.readObject();
inOne.close();
inTwo.close();
}
catch(Exception ee){}
if(员工表.containsKey(number)){
employee stu=(employee)员工表.get(number);
姓名.setText(stu.getName());
if(stu.getSex().equals("男")){男.setSelected(true);}
else{女.setSelected(true);}
}
String m="确定要删除该员工的记录吗?";
int ok=JOptionPane.showConfirmDialog(null,m,"确认",
JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
if(ok==JOptionPane.YES_OPTION){
员工表.remove(number);
try{
outOne=new FileOutputStream(file);
outTwo=new ObjectOutputStream(outOne);
outTwo.writeObject(员工表);
outTwo.close();
outOne.close();
工号.setText(null);
姓名.setText(null);
}
catch(Exception ee){System.out.println(ee);}
}
else if(ok==JOptionPane.NO_OPTION){
工号.setText(null);
姓名.setText(null);
}
else{
String warning="该号不存在!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
else{
String warning="必须输入工号!";
JOptionPane.showMessageDialog(null,warning,
"警告",JOptionPane.WARNING_MESSAGE);
}
}
}
4.7 显示员工信息
实现ActionListener接口对构造的XSAct类用于接收操作事件的侦听器接口。而使用该类创建的对象可使用组件的 addActionListener 方法向该组件注册。在发生操作事件时,调用该对象的 actionPerformed 方法。从而调用SShow()方法实现显示员工信息的功能。
class XSAct implements ActionListener{
public void actionPerformed(ActionEvent e){
new SShow(file);
}
}
编写SShow类继承JDialog,定义Hashtable类的“员工表”、JTextArea类的“显示”和处理字符流的FileInputStream和ObjectInputStream类型的inOne与inTwo,并对他们初始化。在SShow()方法中使用JTextArea类设置显示面板,调用JScrollPane方法管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口,最终设置如图所示的显示面板。inTwo=new ObjectInputStream(new FileInputStream(file)); 员工表=(Hashtable)inTwo.readObject(); inTwo.close();对文本文件的读取,使用isEmpty()和append()方法判断散列表中的内容是否为空并把信息显示在JTextArea文本显示区中。实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。使用“显示.append(str)” 方法将这些元素追加到显示区域中。以下为程序功能实现的代码:
class SShow extends JDialog{
Hashtable 员工表= null;
JTextArea 显示=null;
FileInputStream inOne=null;
ObjectInputStream inTwo=null;
File file=null;
public SShow(File file){
super(new JFrame(),"显示对话框");
this.file=file;
显示=new JTextArea(16,30);
try{
inTwo=new ObjectInputStream(new FileInputStream(file));
员工表=(Hashtable)inTwo.readObject();
inTwo.close();
}
catch(Exception ee){}
if(员工表.isEmpty())显示.append("目前还没有员工的信息记录!\\n");
else{
显示.setText("工号 姓名 性别 \\n");
for(Enumeration enm=员工表.elements();enm.hasMoreElements();){
employee stu=(employee)enm.nextElement();
String sex="";
if(stu.getSex().equals("男"))sex="男";
else sex="女";
String str=stu.getNumber()++stu.getName()++sex+
"\\n";
显示.append(str);
}
}
JScrollPane scroll=new JScrollPane(显示);
Container con=getContentPane();
con.add("Center",scroll);
con.validate();
setVisible(true);
setBounds(100,100,400,300);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){setVisible(false);}
}
);
}
}
}
在Eclipse下运行程序,截图如下:
五、设计总结
通过这几天的课程设计的学习的亲身实践对我来说收获颇丰从一开始的懵懵懂懂到现在可以理解编译简单的程序经历了一段难忘的过程。Java语法很多
要想熟练掌握在记下来的同时还要很好的理解,看见身边精通java的同学可以自由的在电脑上书写他们想要做到的操作我心里不禁倍感羡慕,对于我来说java不好理解一些应该知道的基本知识都还没有很好的掌握比如GUI和接口还有监听接口对我来说都是难点究其原因是平时应该下的功夫太少,没有好好温习老师传授的知识。至此有机会温习并实践书本上的知识对我来说也是一个机会通过对知识的复习以及老师同学的指导对Java有了更深层次的领悟一对今后如何学习Java积累了经验。当看到自己写的东西在屏幕上运行是心中的喜悦不言而喻这不是Java课程设计的结束而是Java学习新的开始,快餐式的学习方法不可取,今后我要踏踏实实地从平日里就勤加练习,多多实践,只有实践的多,写代码才能熟练。
参考文献
[1] 赵毅主.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006
[2] 龚永罡、陈昕.Java程序设计[M].清华大学出版社,2009
[3] 《java 2程序设计教程》 作者:Harvey M.Deitel 和 Paul J.Deitel 机械工业出版社, 2008
[4] 黄晓东等. Java课程设计案例精编(第2版)[M].北京:中国水利水电出版社,2007
致谢
本论文是在***老师指导下完成的。他严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。在此,我向谭老师致以诚挚的谢意和崇高的敬意。
同时我还要感谢我的同学们,在论文设计中,他们给了我很多的建议和帮助。我还要感谢我的论文中被引用或参考的文献的作者。