第一篇:java实训 ATM取款机
ATM取款机课程设计报告
姓
名: 学
号: 专
业: 班
级:
ATM取款机 课程设计过程概述
2009年6月,JAVA游戏开发课程设计在实验楼三楼机房进行,持续时间为两周。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。我开发了一个ATM柜员机。课程设计题目描述和基本设计要求
我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。系统需求分析 3.1 功能需求分析
本ATM柜员机的主要功能如下所述:
要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。3.2 其他需求分析
(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束
开发工具:JCrator ProV3.5.0 运行环境:Windows 2000以上 能实现用户所定义的各项需求。(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。系统设计 4.1 总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示:
图1
ATM功能结构示意图
4.2 ATM柜员机界面设计
我觉得一个系统的界面应该要简单明了,当然样式美观就更好了。我设计的界面主要是由窗体组成,操作简单。而每一个窗口则执行相应的功能。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为:WindowBox(String s,Account act){super(“ATM柜员机”);}、Selection(String s,Account act){ } 向Frame窗口中添加组件使用add()。super(s);
例如:button1 = new Button(“存款”);
p1.add(button1);this.add(p1);每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。Frame也可以引发WindowsEvent类代表的窗口事件。相应源代码为:
addWindowListener(new WindowAdapter()//窗口侦听器,以从此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//处理窗口关闭事件
{ System.exit(0);} });}(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。所以整个设计就趋向简单化了。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvent e)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
4.3 各功能模块设计 4.3.1 登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。
我定义了文本框累的对象tf1,tf2。抓药是用于输入单行的文本;文本区调用public
String getText()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。此模块相应的部分源代码为:
public void actionPerformed(ActionEvent e){
Account act;String card;
String pwd;
act=new Account(“000000”,“Devil”,“123456”,50000);//初始化
/*选择各种服务*/ if(e.getSource()== button1){
String number1,number2;
number1=tf1.getText();
number2=tf2.getText();/*判断密码和卡号是否正确*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
/*卡号和密码都正确则进入功能选择窗口*/
}
Selection s = new Selection(“选择服务”,act);
}else{
}
dispose();
ErrorWarn ew = new ErrorWarn(“消息!”,act);
/*退卡*/ if(e.getSource()==button2){
}
System.exit(0);dispose();} 4.3.2 选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。其中的部分源代码为:
p.add(new Label(“请选择你要的服务”));
this.add(p);button1 = new Button(“存款”);p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查询余额”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密码”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);
} });} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);//setLayout(new GridLayout());setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){
if(e.getSource()==button2){//取款
} if(e.getSource()==button3){//查询余额
} else if(e.getSource()==button4){//退出
} else if(e.getSource()==button5){//修改密码
ChangePassword cp = new ChangePassword(“修改密码”,act);dispose();
dispose();GetBalance gb = new GetBalance(“取款”,act);
Query q =new Query(“查询余额”,act);dispose();System.exit(0);dispose();
} }
} 4.3.3 取款模块设计
在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。其方法为:
if(e.getSource()==button){
/*判断余额是否为负*/
if(act.get_Money()<0){
}
dispose();
ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act);
/*判断取款数额是否小于卡里余额*/ else if(money<=act.get_Money()){
/*取款的数额必须是100的倍数且每次最多只能取5000块*/
if((money%100!=0)||(money>=5000)){
}
act.set_Balance(money);//重新设置卡里的余额 this.setVisible(false);
dispose();
ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act);
/*取款后就再次进入选择界面*/
Selection s = new Selection(“选择服务”,act);
//dispose();}else if(money>act.get_Money()){
}
}
dispose();
ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act);4.3.4 修改密码模块设计
在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。在修改密码时用到的方法为:
/*判断旧密码是是否正确*/ if(pwd2.equals(act.get_Password())){ /*判断两次输入的密码是否匹配*/ if(pwd3.equals(pwd4)){
/*如果都正确的话就设置新密码*/
act.setPassword(pwd3);dispose();Selection s = new Selection(“选择”,act);
}else{
dispose();}
ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{
this.setVisible(false);
}
ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act);
dispose();
4.3.5 退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出
} System.exit(0);dispose();这个方法就可以实现了,这里就不再多说了。
4.4 异常处理情况说明
(1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException(3)加载类时的异常处理
需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。
(4)加载URL时的异常
需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。系统实现与测试
(1)打开DOS,编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报右下图的错误。
图2 主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。
图3 选择服务界面
(3)取款界面,如图4所示。
图4 取款界面
当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。
图5 输入错误1 当取款时如果超过卡里的余额的话就会报图6的错误。
图6 输入错误2(4)查询余额界面,如图7所示。
图7 查询余额界面
经过测试,所有的功能基本上都实现了,而且运行正常。课程设计总结
6.1 遇到的问题及解决办法
在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具
体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。
6.2 心得体会
在这次的学年度课程设计中,我主要运用了Java语言的界面设计、异常处理、、Awt控件、Swing控件,输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。
通过这两个礼拜的课程设计我真的学到了很多的东西,当然这也和我的同学的帮助是离不开的。好了,下面就谈一下我在这些天的体会吧:
在这次的课程设计中,主要是运用JAVA语言来编写一个小的应用程序,当然还可以用其他的技术来辅助了。在这个小应用程序当中,我用了Java外还用了Swing控件。输入输出流等技术。由于以前学的不是很扎实,而且还有些知识我们都是没有学过的,这就要求我们去查相关的书籍,还有就是和同学之间的交流。正因为这样,才锻炼了我的自学的能力,还有就是加深了我对各个知识点的认识,并且提高了我对专业的学习的兴趣,为我以后的学习打下了基础。此外,我还感受到了面向对象语言的类库的强大的功能,掌握了运用JAVA中的类实现某些基本功能,并学会了自己查询使用类的方法,也就是要会用API文档,为以后更好的学习面向对象语言奠定了基础。
通过将近两周的努力,这次课程设计终于结束了,在这个过程当中,我学到了很多的知识,同时也感谢我的同学的帮助和指导。在以后的学习当中,我会更加努力的学习好专业知识,并将所学的知识用于实践当中去,以便牢固掌握知识。
参考文献
[1] 王萌,刘婧,来宾著.JAVA程序设计[M]北京 冶金工业出版社,2004 [2] 黄聪明
精通 JAVA2程序设计[M]北京:清华大学出版社,2004.4 [3] 王文涛,袁海燕 JAVA实用程序设计100例[M]北京:人民邮电出版社,2005.5 [4] 雍俊海 JAVA程序设计[M]北京:清华大学出版社,2006.8 [5] 刘宝林 JAVA程序设计与案例[M]北京:高等教育出版社,2006.11 附录
import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;import java.io.*;
/*登陆页面首窗口*/ class WindowBox extends Frame implements ActionListener{
Box baseBox,box1,box2;TextField tf1,tf2;Button button1;Button button2;WindowBox(String s){//构造方法 super(s);
tf1 = new TextField(6);
tf2 = new TextField(6);
box1= Box.createVerticalBox;box1.add(new Label(“请输入你的卡号”));//输入卡号 box1.add(Box.createVerticalStrut(8));box1.add(new Label(“请输入你的密码”));//输入密码
} box2=Box.createVerticalBox();box2.add(tf1);//box2.add(new TextField(16));box2.add(Box.createVerticalStrut(8));box2.add(tf2);//box2.add(new TextField(16));baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(“确定”);//加入按钮 button1.addActionListener(this);add(button1);
button2 = new Button(“退卡”);//退卡按钮 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*监听器*/ this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
});System.exit(0);} setBounds(120,125,200,175);setVisible(true);
public void actionPerformed(ActionEvent e){ Account act;String card;
String pwd;
act=new Account(“000000”,“Devil”,“123456”,50000);//初始化
/*选择各种服务*/ if(e.getSource()== button1){
String number1,number2;//输入的两个卡号和密码的变量
number1=tf1.getText();
number2=tf2.getText();
/*判断两次输入的卡号和密码是否正确*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){
dispose();
Selection s = new Selection(“选择服务”,act);
}else{
dispose();
ErrorWarn ew = new ErrorWarn(“消息!”,act);//报输入密码或卡号不正确
} }
/*主函数*/ class ATM{
}
} if(e.getSource()==button2){
} System.exit(0);dispose();//退出
} public static void main(String [] args){ } new WindowBox(“登录页面”);/*选择服务*/ import java.awt.*;import java.awt.event.*;class Selection extends Frame implements ActionListener{
Button button1,button2,button3,button4,button5;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act;
public Selection(){} Selection(String s,Account act){
super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(“请选择你要的服务”));this.add(p);
/*各种服务功能*/ button1 = new Button(“存款”);
} p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查询余额”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密码”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
});System.exit(0);} button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(150,150,200,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){
}
} if(e.getSource()==button2){//取款
} if(e.getSource()==button3){//查询余额
} else if(e.getSource()==button4){//退出
} else if(e.getSource()==button5){//修改密码
}
ChangePassword cp = new ChangePassword(“修改密码”,act);dispose();System.exit(0);dispose();Query q =new Query(“查询余额”,act);dispose();dispose();GetBalance gb = new GetBalance(“取款”,act);
/*class Test4{ public static void main(String [] args){
Selection s = new Selection(“选择”);
/*取款功能*/ import javax.swing.*;import java.awt.*;
}*/ } import javax.swing.border.*;import java.awt.event.*;class GetBalance extends Frame implements ActionListener{
Box baseBox, box1,box2;Button button;TextField tf;Account act;GetBalance(String s,Account act){//构造函数
super(s);this.act=act;button=new Button(“确定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“请输入你想取钱的数目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){
});public void windowClosing(WindowEvent e){
}
System.exit(0);setBounds(200,200,150,150);this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
于5000
} //System.out.println(e.getActionCommand());double money;
money = Double.parseDouble(tf.getText().trim());if(e.getSource()==button){ if(act.get_Money()<0){//判断余额是否为负
dispose();
ErrorWarn4 ew4 = new ErrorWarn4(“消息!”,act);} else if(money<=act.get_Money()){//取钱的数额不大于余额 if((money%100!=0)||(money>=5000)){//取钱数为100的倍数或不大
dispose();
ErrorWarn6 ew6 = new ErrorWarn6(“消息!”,act);
}
act.set_Balance(money);//重置余额
this.setVisible(false);
Selection s = new Selection(“选择服务”,act);//返回选择服务窗口
//dispose();
}else if(money>act.get_Money()){判断取款数额是否大于余额
dispose();
ErrorWarn5 ew5 = new ErrorWarn5(“消息!”,act);
} }
} /* public static void main(String[] args){
}
/*修改密码功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class ChangePassword extends Frame implements ActionListener{
Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();TextField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){
super(s);this.act=act;
GetBalance test = new GetBalance(“dfdf”);} GetBalance gb = new GetBalance(“取款”);tf4 = new TextField(6);tf5 = new TextField(6);tf6 = new TextField(6);button = new Button(“确定”);
button.addActionListener(this);/*建立新密码*/
} /*判断事件源,看条件是否成立再修改密码*/ public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4;
pwd2 = tf4.getText();
panel1.add(new Label(“请输入你的旧密码:”));panel1.add(tf4);panel2.add(new Label(“请输入你的新密码:”));panel2.add(tf5);panel3.add(new Label(“请再次输入你的新密码”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,250,250);this.setVisible(true);/*窗口事件*/ this.addWindowListener(new WindowAdapter(){
});public void windowClosing(WindowEvent e){
}
System.exit(0);
} }
pwd3 = tf5.getText();
pwd4 = tf6.getText();
} if(pwd2.equals(act.get_Password())){//判断旧密码是否正确
if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配
act.setPassword(pwd3);//启用新的密码 dispose();Selection s = new Selection(“选择”,act);//返回选择服务窗口
}else{
//this.setVisible(true);
//ErrorWarn2 ew = new ErrorWarn2(“消息”,act);
dispose();}
ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act);}else{
this.setVisible(false);
}
ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act);
dispose();/*查询余额功能*/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*;class Query extends Frame implements ActionListener{
//Account act;Button button;Account act;Query(String s,Account act){//构造函数
} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ dispose();
super(s);this.act = act;
button=new Button(“确定”);//TextField tf = new TextField(6);Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(“你的余额为: ” + act.get_Money()));//查询余额的方法 //panel1.add(tf);
button.addActionListener(this);panel.add(button);this.add(panel);this.add(panel1);this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){
});public void windowClosing(WindowEvent e){
}
System.exit(0);setBounds(200,200,150,150);setVisible(true);
}
} Selection s = new Selection(“选择服务”,act);//返回选择服务窗口 } /*账户*/ import java.io.*;
/*该类为实现客户信息及部分功能*/ class Account { private String code
=null;
//信用卡号
private String name
=null;
//客户姓名
private String password=null;
//客户密码
private double money
=0.0;
//卡里金额
/********************/ public Account(String code,String name,String password,double money){
this.code=code;
this.name=name;
this.password=password;
this.money=money;}
public String get_Code(){//取得卡号
return code;}
public String get_Name(){//取得名字
return name;}
public String get_Password(){//取得密码
return password;}
public double get_Money(){//取得余额
return money;}
/*得到剩余的钱的数目*/ protected void set_Balance(double mon){
money-= mon;} /*重置秘密的方法*/ public String setPassword(String pwd){
} } password = pwd;return password;
第二篇:ATM取款机java课程设计
黄
淮
学
院
JAVA 课程设计报告
题
目: 《ATM柜员机》课程设计
学
院:
信 息 工 程 学 院
专
业:
计算机科学与技术
指导老师:
二0一三年六月
目录 课程设计过程概述.......................................................................................3 2 课程设计题目描述和基本设计要求...........................................................3 3 系统需求分析...............................................................................................3 3.1 功能需求分析···················································································· 3 3.2 其他需求分析···················································································· 4 4 系统设计........................................................................................................4 4.1 总体设计 ··························································································· 4 4.2 ATM柜员机界面设计 ········································································· 5 4.3 各功能模块设计 ················································································ 7
4.3.1 登陆页面模块设计 ····························································· 7 4.3.2 选择服务模块设计 ····························································· 8 4.3.3 取款模块设计 ····································································· 9 4.3.4 修改密码模块设计 ····························································· 9 4.3.5 退卡模块设计 ··································································· 10
4.4 异常处理情况说明 ·········································································· 10 5 系统实现与测试.........................................................................................11 6 课程设计总结.............................................................................................13 6.1 遇到的问题及解决办法 ·································································· 13 6.2 心得体会 ························································································· 14 参考文献..........................................................................................................15 附录..................................................................................................................15
ATM初始账号:000000
初始密码:123456
ATM柜员机 课程设计过程概述
2013年6月,JAVA课程设计在1#楼六楼机房进行,持续时间为两周。这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。我们开发了一个ATM柜员机。课程设计题目描述和基本设计要求
我设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。3 系统需求分析 3.1 功能需求分析
本ATM柜员机的主要功能如下所述:
要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可
以按照以下规则进行:
查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。 ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
3.2 其他需求分析(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束 开发工具:MyEclipse 运行环境:Windows XP、Window 7 能实现用户所定义的各项需求。(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。4 系统设计 4.1 总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组
成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示:
图1 ATM功能结构示意图 4.2 ATM柜员机界面设计
我们觉得一个系统的界面应该要简单明了,当然样式美观就更好了。我设计的界面主要是由窗体组成,操作简单。而每一个窗口则执行相应的功能。
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。我设计的界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不
同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为: 向Frame窗口中添加组件使用add()。例如:button1 = new Button(“存款”);p1.add(button1);this.add(p1);每个Frame在其右上角都有三个控制图标,分别代表将窗口最小化、窗口最大化和关闭的操作,其中最小化和最大化操作Frame可自动完成,而关闭窗口操作实现需要书写有关的代码,在我的程序中我采用的是对WINDOWS_CLOSING事件做出响应,调用dispose()方法关闭窗口。Frame也可以引发WindowsEvent类代表的窗口事件。相应源代码为:
addWindowListener(new WindowAdapter()//窗口侦听器,以从此窗口接收窗口事件
{public void windowClosing(WindowEvent e)//处理窗口关闭事件 { System.exit(0);} });}(2)窗体的主要结构的设计
我所设计的窗口的主要结构的特点就是每个窗口都对应着一个特定的功能。比如说报各种各样的错,还有各种查询余额、取款、选择服务等,所以它们都是由各种按钮和文本框,标签组成的,而联系各个窗体成为一个整体的就是各个按钮的监听事件。所以整个设计就趋向简单化了。
为了定义各个按钮所对应的命令和操作,首先需要将各个按钮注册给实现了动作事件的监听接口ActionListener的监听者,然后为监听者定义actionPerformed(ActionEvent e)方法,在这个方法中调用e.getSource()或e.getActionCommand()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。4.3 各功能模块设计 4.3.1 登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。我定义了文本框类的对象tf1,tf2。是用于输入单行的文本;文本区调用public String getPassword()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。此模块相应的部分源代码为:
public void actionPerformed(ActionEvent e){ Account act;act=new Account(“000000”,“HuangHuai”,“123456”,50000);//初始化
/*选择各种服务*/ if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量
number1=tf1.getText().toString();number2 = new String(tf2.getPassword());
/*判断两次输入的卡号和密码是否正确*/
if((act.getCode().equals(number1))&&(act.getPassword().equals(number2))){
dispose();
new Selection(“选择服务”,act);}else{
JOptionPane.showMessageDialog(this, “密码或帐号错误!”,“账户提
示信息”,JOptionPane.ERROR_MESSAGE);
dispose();
new WindowBox(“ATM”);
} }
if(e.getSource()==button2){
System.exit(0);
dispose();//退出
} } 4.3.2 选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。其中的部分源代码为:
p.add(new Label(“请选择你要的服务”));
this.add(p);/*各种服务功能*/
buttonCUN = new Button(“ 存 款 ”);
p1.add(buttonCUN);
this.add(p1);
buttonQU = new Button(“ 取 款 ”);
p2.add(buttonQU);
this.add(p2);
buttonCHA = new Button(“ 查询余额 ”);
p3.add(buttonCHA);
this.add(p3);
buttonTUI = new Button(“ 退 出 ”);
p4.add(buttonTUI);
this.add(p4);
buttonGAI = new Button(“ 修改密码 ”);
4.3.3 取款模块设计
在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。其方法为:
public String withdrawMoney(double money){
String str = null;
if(money<=0){
str = “取款数目须是正数!”;}else{
if(getMoney()<0){//判断余额是否为负
str=“余额为负数!”;
}else if(money<=getMoney()){
if((money%100!=0)||(money>=5000)){//取钱数为100的倍数或不大于5000
str= “取款数目须是一百的整数倍!”;
}else{
setBalance(money);
str = “取款成功:余额为”+getMoney();
}
}else{
str = “余额不足!”;
}
} return str;} 4.3.4 修改密码模块设计
在修改密码模块中,首先你必须要输入你的旧密码是否正确,否则就会报错。再一个就是要两次输入你的新密码,且两次药匹配,否则也会报错,然后再重新回到修改密码的界面。在修改密码时用到的方法为:
/*判断旧密码是是否正确*/ if(pwd2.equals(pwd1)){
if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配
act.changePassword(pwd3);//启用新的密码
dispose();
JOptionPane.showMessageDialog(this, “修改密码成功!”);
new Selection(“选择”,act);//返回选择服务窗口
}else{
this.setVisible(true);
dispose();
JOptionPane.showMessageDialog(this, “两次输入要修改的密码不同,更新密码失败!”);
new Selection(“选择”,act);
} }else{
this.setVisible(false);
dispose();
JOptionPane.showMessageDialog(this, “输入密码错误,更新密码失败!”);
new Selection(“选择”,act);} } 4.3.5 退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==buttonTUI){//退出
System.exit(0);
dispose();
} 这个方法就可以实现了,这里就不再多说了。4.4 异常处理情况说明
(1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException
(3)加载类时的异常处理
需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。(4)加载URL时的异常
需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。5 系统实现与测试
(1)打开MyEclipse,编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报下图的错误。
图2 主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。
图3 选择服务界面
(3)取款界面,如图4所示。
图4 取款界面
当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。
图5 输入错误
当取款时如果超过卡里的余额的话就会报图6的错误。
图6 输入错误2(4)查询余额界面,如图7所示。
图7 查询余额界面
(5)修改密码界面,如下图所示。
经过测试,所有的功能基本上都实现了,而且运行正常。6 课程设计总结
6.1 遇到的问题及解决办法
在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战;还有对于正规开发一个系统的流程不熟悉,适应起来比
较慢,编写各个模块相对应的操作时,自己感觉难以动手,这表明所学的知识不能灵活运用到实际中。
对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解,还有就是多跟精通此方面的老师和同学交流,取其精华。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。6.2 心得体会
在这次的学课程设计中,我主要运用了Java语言的界面设计、异常处理、、Awt控件、Swing控件,输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。
通过这两个礼拜的课程设计我真的学到了很多的东西,当然这也和我的同学的帮助是离不开的。好了,下面就谈一下我在这些天的体会吧: 在这次的课程设计中,主要是运用JAVA语言来编写一个小的应用程序,当然还可以用其他的技术来辅助了。在这个小应用程序当中,我用了Java外还用了Swing控件。输入输出流等技术。由于以前学的不是很扎实,而且还有些知识我们都是没有学过的,这就要求我们去查相关的书籍,还有就是和同学之间的交流。正因为这样,才锻炼了我的自学的能力,还有就是加深了我对各个知识点的认识,并且提高了我对专业的学习的兴趣,为我以后的学习打下了基础。此外,我还
感受到了面向对象语言的类库的强大的功能,掌握了运用JAVA中的类实现某些基本功能,并学会了自己查询使用类的方法,也就是要会用API文档,为以后更好的学习面向对象语言奠定了基础。通过将近两周的努力,这次课程设计终于结束了,在这个过程当中,我学到了很多的知识,同时也感谢我的同学的帮助和指导。在以后的学习当中,我会更加努力的学习好专业知识,并将所学的知识用于实践当中去,以便牢固掌握知识。参考文献
[1] 王萌,刘婧,来宾著.JAVA程序设计[M]北京 冶金工业出版社,2004 [2] 黄聪明 精通 JAVA2程序设计[M]北京:清华大学出版社,2004.4 [3] 王文涛,袁海燕 JAVA实用程序设计100例[M]北京:人民邮电出版社,2005.5 [4] 雍俊海 JAVA程序设计[M]北京:清华大学出版社,2006.8 [5] 刘宝林 JAVA程序设计与案例[M]北京:高等教育出版社,2006.11 附录
Account类:
package cn.com.account;/** * 帐户
* 该类为实现客户信息及部分功能 */
public class Account {
private String code = null;//信用卡号 private String name = null;//客户姓名 private String password= null;//客户密码 private double money = 0.0;//卡里金额
public Account(){
}
public Account(String code,String name,String password,double money){
} public String getCode(){//取得卡号
return code;} public String getName(){//取得名字
return name;} /**
* 取得密码 * @return */
public String getPassword(){ } /**
* 重置秘密的方法 */
public void changePassword(String pwd){ }
public double getMoney(){//取得余额
return money;} /**
* 得到剩余的钱的数目 */
private void setBalance(double mon){ } money-= mon;password = pwd;return password;this.code=code;this.name=name;this.password=password;this.money=money;this.code = “123456”;this.password = “123456”;
} /** * 取款设置 * 若成功显示余额 * 不成功显示提示信息 */
public String withdrawMoney(double money){ String str = null;if(money<=0){ str = “取款数目须是正数!”;}else{
if(getMoney()<0){//判断余额是否为负
str=“余额为负数!”;}else if(money<=getMoney()){
if((money%100!=0)||(money>=5000)){//取钱数为100的倍数 str= “取款数目须是一百的整数倍!”;}else{
setBalance(money);str = “取款成功:余额为”+getMoney();} 或不大于5000
}else{
str = “余额不足!”;}
} return str;} /** * 存款设置 * 若成功显示余额 * 不成功显示提示信息 */
public String depositMoney(double money){
} String str = null;
if(money<0){ str =“存款数目须是正数!”;}else{ setBalance(-money);str = “存款成功:余额为”+getMoney();} return str;ChangePassword类:
package cn.com.frameui;import cn.com.account.Account;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class ChangePassword extends Frame implements ActionListener{
Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();//TextField tf4,tf5,tf6;JPasswordField tf4,tf5,tf6;Button button;Account act;ChangePassword(String s,Account act){
super(s);this.act=act;
tf4 = new JPasswordField(6);tf5 = new JPasswordField(6);tf6 = new JPasswordField(6);button = new Button(“确定”);button.addActionListener(this);/*建立新密码*/
panel1.add(new Label(“请输入你的旧密码:”));panel1.add(tf4);panel2.add(new Label(“请输入你的新密码:”));panel2.add(tf5);panel3.add(new Label(“请再次输入新密码:”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4,1));setBounds(200,200,300,200);this.setVisible(true);/**
* 窗口事件, 判断窗口是否关闭 */
this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
System.exit(0);
}
}
} });/**
* 判断事件源,看条件是否成立再修改密码 */
public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ String pwd2,pwd3,pwd4,pwd1;char [] p2,p3,p4;pwd1 = act.getPassword();p2=tf4.getPassword();p3=tf5.getPassword();p4=tf6.getPassword();
pwd2 = new String(p2);pwd3 = new String(p3);pwd4 = new String(p4);
if(pwd2.equals(pwd1)){
if(pwd3.equals(pwd4)){//判断两次输入的新密码是个匹配
act.changePassword(pwd3);//启用新的密码 dispose();JOptionPane.showMessageDialog(this, “修改密码成功!”);new Selection(“选择”,act);//返回选择服务窗口 }else{ this.setVisible(true);dispose();JOptionPane.showMessageDialog(this, “两次输入要修改的密码不同, new Selection(”选择“,act);}
this.setVisible(false);dispose();JOptionPane.showMessageDialog(this, ”输入密码错误,更新密码失更新密码失败!“);}else{ 败!”);
new Selection(“选择”,act);} } }
GetBalance类:
package cn.com.frameui;import cn.com.account.*;import javax.swing.*;
import java.awt.*;import java.awt.event.*;@SuppressWarnings(“serial”)public class GetBalance extends Frame implements ActionListener{
Box baseBox, box1,box2;Button button;TextField tf;Account act;public GetBalance(String s,Account act){//构造函数
super(s);
}
public void actionPerformed(ActionEvent e){
double money;String str = null;/*
* 取款判定 */ this.act=act;button=new Button(“确定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(“请输入你想取钱的数目”));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ }
System.exit(0);});setBounds(200,200,300,200);this.setVisible(true);
if(tf.getText().toString().equals(“")){ str = ”取款数目不能为空!“;}else{
} money = Double.parseDouble(tf.getText().toString());str = act.withdrawMoney(money);
JOptionPane.showMessageDialog(this, str,”取款提示信息“,JOptionPane.PLAIN_MESSAGE);
} this.setVisible(false);new Selection(”选择服务“,act);}
Query类:
package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Query extends Frame implements ActionListener{
Button button;Account act;public Query(String s,Account act){//构造函数
super(s);
this.act = act;
button=new Button(”确定“);
Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(”你的余额为: “ + act.getMoney()));//查询余额的方法
this.add(panel1);this.add(panel);
button.addActionListener(this);panel.add(button);
this.setLayout(new GridLayout(2,1));this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){
}
}
}
System.exit(0);});setBounds(200,200,200,150);setVisible(true);public void actionPerformed(ActionEvent e){
} if(e.getSource()==button){ dispose();new Selection(”选择服务“,act);//返回选择服务窗口
} Selection类:
package cn.com.frameui;import cn.com.account.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class Selection extends Frame implements ActionListener{
Button buttonCUN,buttonQU,buttonCHA,buttonTUI,buttonGAI;Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act;
public Selection(){} public Selection(String s,Account act){
super(s);this.act=act;this.setLayout(null);this.setLayout(new GridLayout(6,1));p.add(new Label(”请选择你要的服务“));this.add(p);buttonCUN = new Button(” 存 款 “);p1.add(buttonCUN);this.add(p1);buttonQU = new Button(” 取 款 “);p2.add(buttonQU);/*各种服务功能*/
} this.add(p2);buttonCHA = new Button(” 查询余额 “);p3.add(buttonCHA);this.add(p3);buttonTUI = new Button(” 退 出 “);p4.add(buttonTUI);this.add(p4);buttonGAI = new Button(” 修改密码 “);p5.add(buttonGAI);this.add(p5);this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);} });buttonCUN.addActionListener(this);buttonQU.addActionListener(this);buttonCHA.addActionListener(this);buttonTUI.addActionListener(this);buttonGAI.addActionListener(this);setBounds(150,150,300,200);setVisible(true);validate();public void actionPerformed(ActionEvent e){
if(e.getSource()==buttonCUN){//存款
dispose();new SetBalance(”存款款“,act);
}else if(e.getSource()==buttonQU){//取款
dispose();new GetBalance(”取款“,act);
}else if(e.getSource()==buttonCHA){//查询余额
dispose();new Query(”查询余额“,act);
}else if(e.getSource()==buttonTUI){//退出
System.exit(0);dispose();
}
} }else if(e.getSource()==buttonGAI){//修改密码
dispose();new ChangePassword(”修改密码“,act);
} SetBalance类:
package cn.com.frameui;import cn.com.account.*;import javax.swing.*;import java.awt.*;import java.awt.event.*;@SuppressWarnings(”serial“)public class SetBalance extends Frame implements ActionListener{
Box baseBox, box1,box2;Button button;TextField tf;Account act;public SetBalance(String s,Account act){//构造函数
super(s);
}
public void actionPerformed(ActionEvent e){ this.act=act;button=new Button(”确定“);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2,1));panel1.add(new Label(”请输入你想存款的数目“));panel1.add(tf);panel.add(button);this.add(panel1);this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ }
System.exit(0);});setBounds(200,200,300,200);this.setVisible(true);
double money;String str = null;if(tf.getText().toString().equals(”“)){ str = ”存款数目不能为空!“;}else{
} money = Double.parseDouble(tf.getText().toString());str = act.depositMoney(money);
JOptionPane.showMessageDialog(this, str,”存款提示信息“,JOptionPane.INFORMATION_MESSAGE);
} dispose();this.setVisible(false);new Selection(”选择服务“,act);} WindowBox类:
package cn.com.frameui;import cn.com.account.Account;import javax.swing.*;
import java.awt.*;import java.awt.event.*;/**
* 登陆页面首窗口 */
@SuppressWarnings(”serial“)public class WindowBox extends Frame implements ActionListener{
box1= Box.createVerticalBox();box1.add(new Label(”请输入您的卡号“));//输入卡号 box1.add(Box.createVerticalStrut(8));box1.add(new Label(”请输入您的密码“));//输入密码 box2=Box.createVerticalBox();Box baseBox,box1,box2;TextField tf1;JPasswordField tf2;Button button1;Button button2;public WindowBox(String s){//构造方法
super(s);tf1 = new TextField(6);tf2 = new JPasswordField(6);
} box2.add(tf1);
box2.add(Box.createVerticalStrut(8));box2.add(tf2);
baseBox=Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1= new Button(”确定“);//加入按钮 button1.addActionListener(this);add(button1);
button2 = new Button(”退卡“);//退卡按钮 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/*监听器*/
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(120,125,300,200);setVisible(true);public void actionPerformed(ActionEvent e){ Account act;act=new Account(”000000“,”HuangHuai“,”123456“,50000);//初始化
/*选择各种服务*/
if(e.getSource()== button1){ String number1,number2;//输入的两个卡号和密码的变量 number1=tf1.getText().toString();number2 = new String(tf2.getPassword());
/*判断两次输入的卡号和密码是否正确*/
if((act.getCode().equals(number1))&&(act.getPassword().equals(num dispose();ber2))){ new Selection(”选择服务“,act);}else{
JOptionPane.showMessageDialog(this, ”密码或帐号错误!“,”账户提示信息“,JOptionPane.ERROR_MESSAGE);dispose();
new WindowBox(”ATM“);} }
if(e.getSource()==button2){
System.exit(0);
dispose();//退出
} } }
package cn.com.test;import cn.com.frameui.*;public class ATM { /**
* 主测试程序
* @param args
*/
public static void main(String[] args){
new WindowBox(”ATM");} }
第三篇:ATM自助取款机系统java代码
public void actionPerformed(ActionEvent e)
//界面显示控制 {
String IC_Number=“";
String password=”“;String IC_No=”“;
z30.setVisible(false);
float
leftmoney=0;
float
moneys=0;
float mon=0;
float money1=0;
float money2=0;
if(true)
{int No_50=0,No_100=0;
String strin=”select NO_50,NO_100 from ATM ATM_ID='123456789'“;ResultSetrsSQLSelect=executeQuery(strin);try{ if(rsSQLSelect.next())
{
No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));
No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));
where
}
}
catch(Exception er){System.out.println(”查询ATM机信息出错!“);}
if(No_50==0&&No_100==0)
{
z1.setVisible(false);
t1.setText(”对不起,本ATM自动取款机暂停服务!“);cl.show(c,”1“);
}
}
cl.show(c,”1“);
if(e.getSource()==z1)
{
t3.setText(”“);
text1.setText(”“);cl.show(c,”2“);
}
if(e.getSource()==z4||e.getSource()==z6||e.getSource()==z11||e.getSource()==z16||e.getSource()==z18||e.getSource()==z22)
{ closeDBConnection();cl.show(c,”1“);
}
if(e.getSource()==z2)
{ closeDBConnection();System.exit(0);
}
if(e.getSource()==z3){ IC_Number=text1.getText().trim();
if(getname(IC_Number))
{z5.setVisible(true);
pw1.setVisible(true);
t4.setVisible(true);
pw1.setText(”“);
t5.setText(”“);cl.show(c,”3“);
}
else
{
t3.setText(”您输入的卡号不存在,请重新输入!“);cl.show(c,”2“);
}
}
if(e.getSource()==z5){
password=pw1.getText().trim();IC_Number=text1.getText().trim();
if(!login(IC_Number,password))
{
t5.setText(”您输入的密码错误,请重新输入!“);
pw1.setText(”“);
n--;cl.show(c,”3“);
}
else
{
t5.setText(”“);cl.show(c,”4“);
}
if(n<0)
{
n=2;
t5.setText(”您已经三次输入错误密码,谢谢您的使用,欢迎下次光临!“);
z5.setVisible(false);
pw1.setVisible(false);
t4.setVisible(false);cl.show(c,”3“);
}
}
if(e.getSource()==z7)
{
t33.setText(”“);cl.show(c,”5“);
}
if(e.getSource()==z8)
//余额查询 { DBAccess d=new DBAccess();
String str3=”“;
String stri=”“;IC_Number=text1.getText().trim();
t29.setText(IC_Number);leftmoney=getmoney(IC_Number);
t30.setText(Float.toString(leftmoney));stri=”select bank_name from IC,bank where IC.bank_NO=bank.bank_NO and IC_ID='“+IC_Number+”'“;ResultSetrsSQLSelect=d.executeQuery(stri);try{
if(rsSQLSelect.next())
{
str3=rsSQLSelect.getString(”bank_name“);
//d.commit();
}
} catch(Exception er){}
t32.setText(str3);cl.show(c,”10“);
}
if(e.getSource()==z9)
{
t23.setText(”“);cl.show(c,”9“);
}
if(e.getSource()==z10)
{
t28.setText(”“);cl.show(c,”11“);
}
if(e.getSource()==z12){ DBAccess d=new DBAccess();IC_Number=text1.getText().trim();fetchmoney=Integer.parseInt(text2.getText());
if(fetchmoney<=0)
{
t9.setText(”取款金额非法!请重新输入!“);
text2.setText(”“);cl.show(c,”6“);
return;
}
if(fetchmoney>1000)
{
t9.setText(”每次交易金额最大为1000元!“);
text2.setText(”“);cl.show(c,”6“);return;
}
if(fetchmoney%50!=0)
{
t9.setText(”取款金额只能为50的倍数!“);
text2.setText(”“);cl.show(c,”6“);return;
} leftmoney=getmoney(IC_Number);
if(fetchmoney>leftmoney)
{
t9.setText(”您的余额不足,请重新输入取款金额!“);
text2.setText(”“);cl.show(c,”6“);return;
}
int No_50=0,No_100=0,x_50=0,x_100=0,mo=0;
String str1=”select NO_50,NO_100 from ATM where ATM_ID='123456789'“;ResultSetrsSQLSelect=d.executeQuery(str1);try{ if(rsSQLSelect.next())
{
No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));
No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));
}
}
catch(Exception er){System.out.println(”查询ATM机信息出错!“);}
x_100=fetchmoney/100;
if(No_100 { mo=fetchmoney-No_100*100; x_50=mo/50; if(x_50>No_50) { t9.setText(”取款机现钞不足!“); text2.setText(”“);cl.show(c,”6“); return; } else { No_50=No_50-x_50; No_100=0; } } else { No_100=No_100-x_100; x_50=(fetchmoney-x_100*100)/50; if(x_50>No_50) { t9.setText(”取款机50面值现钞不足!“); text2.setText(”“);cl.show(c,”6“); return; } else {No_50=No_50-x_50;} } String str2=”update ATM set NO_50=“+No_50+” where ATM_ID='“+ATM_id+”'“; String str3=”update ATM set NO_100=“+No_100+” where ATM_ID='“+ATM_id+”'“;d.executeUpdate(str2);d.executeUpdate(str3); setmoney(fetchmoney,IC_Number); t12.setText(Float.toString(fetchmoney));cl.show(c,”7“); text2.setText(”"); 一、ATM取款机常见故障及解决方法 ATM常见故障如能及时排除,可减少停机时间,因此遇到下列故障可按照相应步骤处理。 (一)用户打印机问题及处理方法 1、用户凭条卡在面板内 (1)检查凭条出口是否有异物堵塞; (2)检查面板有无受力变形; (3)拉出打印机检查传送部分有无异常,推入打印机重试; (4)如仍卡纸, 需进行专业维修。 2、打印纸堵塞在切纸位置 (1)松开传送部件; (2)拉动蓝色手柄,使打印头露出; (3)清除堵塞的纸; (4)查看打印机控制板上有无黄灯常亮; (5)如无,重试打印机; (6)如黄灯长亮,需进行专业维修。 3、凭条双倍长度 (1)检查打印纸上的黑色标记是否清晰; (2)检查黑标方向是否正确; (3)重试,如仍不正常, 需进行专业维修。 (二)流水打印机问题及处理方法 4、打印纸堵塞在切纸位置 (1)清除堵塞的纸; (2)查看打印机控制板上有无黄灯常亮; (3)如无,重试打印机; (4)如黄灯长亮,需进行专业维修。 (三)读卡机问题及处理方法 1、读卡机堵塞 (1)按照关机程序关机; (2)取出读卡机; (3)查看读卡机内有无异物,有则取出; (4)开机,执行读卡机清洗程序; (5)重试读卡机。 2、卡不能插入 (1)按程序关机; (2)取出读卡机,查看有无异常; (3)如流水打印机上无读卡机故障信息,检查面板插卡口有无异常; (4)检查读卡机口有无异常; (5)装回,开机重试;如仍不正常, 需进行专业维修。 (四)吐钞机问题及处理方法 1、出钞不整齐 (1)拉出吐钞机,检查送钞皮带是否脱落; (2)检查出钞口有无异常(如里面低,外面高); (3)检查钱箱内钱币是否整齐; (4)重试, 如仍不正常, 需进行专业维修。 2、只有挖钞声,钱不吐出来 (1)检查钱箱内是否有钱; (2)检查废钞箱内的钱币质量; (3)如上述正常,做加钞程序中的吐钞机诊断; (4)如诊断不能通过,将钱箱换一个通道; (5)再做吐钞机诊断; (6)如仍不正常, 需进行专业维修。 3、吐钞机报“钱币堵塞” (1)按程序关机; (2)拉出吐钞机; (3)查看有无钱币卡在上面传送带; (4)查看有无钱币卡在侧面传送带; (5)取出钱箱,查看通道内有无钱币堵塞; (6)清除堵塞的钱币; (7)重新装回钱箱,开机重试; (8)如故障依旧,检查传感器; (9)更换传感器或进行专业维修。 4、废钞箱卷帘门裂开 (1)取出废钞箱卷帘门; (2)如仅前三条裂开,裁下裂开的那条; (3)装回卷帘门,即可; (4)如已裁下三条以上,更换。 (五)其它故障 1、通讯不通 (1)按程序关机; (2)检查通讯线是否插好; (3)开机,注意系统上电启动时有无提示相关信息; (4)请电信局检查线路; (5)进行专业维修。 2、屏幕无显示 (1)关机; (2)检查显示信号线是否接好; (3)开机,观测是否有系统开机自检信息; (4)如有,表明硬件无问题,重装软件; (5)如无, 进行专业维修。 二、存取款机常见故障的原因及解决方法 1、磁条读写器吞卡 磁条读写器吞卡是由于以下四种情况造成: (1)主机命令 (2)弹卡超时不取走 (3)用户操作超时 (4)插卡动作不当造成。 如果是主机命令或弹卡超时造成吞卡,客户会得到一张打印的客户凭条,凭条上有该卡的卡号和吞卡原因。 如果是由于插卡动作不当或操作超时不取造成吞卡,客户也同样能够得到一张客户凭条,但该凭条上面没有卡号和吞卡原因。 2、存款模块回收箱不空 当回收箱不空时,存款交易暂停,以避免其他客户操作而产生的帐务不清。以下情况存款进入回收箱。 有识别不出的钞票或用户中途取消操作的情况下,存款退回到入钞口,如果客户没有及时取走,机器将把入钞口上全部钞票打入回收箱。 客户钞票识别完毕,提交主机,在等待主机应答超时的情况下,把客户提交的存款打入回收箱,其面值总额应该与客户得到的客户凭条相符。 3、存款模块卡钞票 当钞票在中途卡住,存钞模块停止工作,只有排除故障之后,才能初始化继续。当卡住钞票,整个流水线全部停止。除了在钞票卡住的部位,请检查其前后流水线上是否有钞票在中间。如果有则请旋转绿色旋钮,把钞票取出。这时如果需要继续正常使用存款模块则需要重新启动应用,或者清除存款箱。 4、取款模块钞箱安放不当 取款模块的钞箱分为两种,回收箱和出钞箱,在使用出钞模块之前需要对各出钞箱进行序号设置,为钞箱编号。以尽量减小钞箱装错的可能性。当钞箱安装没有到位,或者顺序不符,系统能够检测到,并提示取款钞箱出错。这时需要重新安装钞箱,直到正确为止。 5、客户插卡后没有可做交易 金库门打开的情况下,只能进行管理员卡类交易。请检查金库门是否关闭好。 系统只有查询交易可以进行 系统缺少客户凭条打印纸,则仅提供查询服务。 6、没有存款功能 存款模块初始化失败,请拧动管理员钥匙,检查设备状态。 存款模块回收箱中有钞票,请检查存款模块中的回收箱。 存款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅存款”。 7、没有取款功能 取款模块初始化失败。 钞箱中钞票数量低于最低限制数量。 取款功能在系统中没有设置,拧动管理员钥匙,修改系统参数为“存取款”或“仅取款”。 三、存折补登机常见故障及处理方法 (一)存折打印机故障 1、磁条读写故障,表现为磁条读写失败 (1)原因分析1:有异物(如纸削)阻塞磁头的水平移动 解决方法:清除异物 (2)原因分析2:磁条读写磁头脏 解决方法:用异丙醇和酒精或随机配送的清洁卡清洗磁头 (3)原因分析3:打印机磁道读写参数与软件系统不匹配 解决方法:更改打印机的磁条读写参数或软件系统参数 (4)原因分析4:磁条读写电路故障 解决方法:更换磁条读写板 (5)原因分析5:磁条读写机械部分故障 解决方法:更换磁条读写组件 2、卡纸(折)、纸(折)进出困难或歪斜 (1)原因分析1:有异物阻塞进出纸槽 解决方法:清除异物 (2)原因分析2:打印机机架故障 解决方法:调整机架 3、打印机无打印动作,常见故障为放入存折后打印机无打印动作 (1)原因分析1:存折无补登项目 解决方法:无需处理 (2)原因分析2:打印机通信接口坏 解决方法:检查联机电缆是否损坏,如损坏更换之;更换打印机主板 (3)原因分析3:主机网络通信故障 解决方法:检查网络通讯部分 (4)原因分析4:多用户卡故障 解决方法:检查在Windows系统内多用户卡的IRQ值是否于BIOS设置值一致(推荐IRQ值取5);更换多用户卡 不能进折或打印头撞墙,或者开机打印头来回移动 原因分析:由于长时间使用,灰尘过多造成光电参数丢失 解决方法:此时请设置光电参数。具体操作如下: (1)关闭电源,打开打印机的上盖; (2)将打印头移到打印机的最左边; (3)按住面板上的三个键,同时打开电源,机械动作停止后,关上机盖; (4)按操作面板上的STATION1键两次,此时READY灯停止闪烁,并发出蜂鸣声; (5)在进纸器槽中插入一张A4的纸并按一次STATION2键; (6)当打印机退出纸张后,再插入一张A4纸,打印机打印出光电参数值。 (二)触摸屏故障 1、触摸屏无反映,常见故障为触摸屏幕鼠标无任何反映 (1)原因分析1:更换、移动、插拔触摸屏的联机接口后会造成触摸屏失效,这是由于触摸屏属于非即插即用产品,因此硬件上的改变都有可能引起触摸屏失效 解决方法:重新安装触摸屏驱动程序 (2)原因分析2:重新安装、克隆操作系统,原因分析如上 解决方法:同上 (3)原因分析3:触摸屏硬件故障 解决方法:更换触摸屏控制卡、联机电缆 2、触摸屏不灵敏,常见故障为需要大力触摸才有反映 原因分析:屏幕灰尘过多,或者有水滴在屏幕上都会造成不灵敏 解决方法:清洁屏幕 触摸屏触摸的位置发生偏移 解决方法:打开控制面板,调用校准程序,根据提示点击3个圆点进行校准 (二)金属键盘故障 1、键反应过灵敏,当按下某一数字键时幕显示输入两个或多个相同数字 原因分析:在系统里设置按键重复时间过短 解决方法:打开“控制面板”里的“键盘”项,如图所示把红色部分按照图中调整即可 2、按键经常无反应,常见故障为多个数字按键无反应 (1)原因分析1:键盘使用时间长,键盘膜片失效 解决方法:更换键盘膜片 (2)原因分析2:键盘电缆松脱或者损坏 解决方法:检查接口是否松脱,电缆是否损坏,更换故障部分 3、整个键盘失效 (1)原因分析1:键盘控制板故障 解决方法:更换键盘控制卡 (2)原因分析2:PC机的键盘PS/2接口坏 解决方法:更换PC主板 (三)PC机及系统其他故障 1、不能开机 (1)原因分析1:PC机电源坏,常见故障为开机时CPU风扇不转动 解决方法:更换PC电源 (2)原因分析2:PC机主板、CPU、内存及其他板卡故障都可能造成不能开机 解决方法:用替换法确定损坏部件进行更换 打开主机电源后PC机不能自动开启,需手动开机 原因分析:BIOS中未设置自动上电开机功能 解决方法:手动开机进入BIOS设置界面,进入“Integrated Peripherals”(整合周边设备)设置项,把选项“Power on Function”设置为“BUTTON ONLY”,把选项“PWRON After PWR-Fail”设置为“On”。(注:上述操作主要针对微星的主板MS-6153,其他型号主板的设置请参考相应主板的说明书) 2、不能进入操作系统或业务画面 (1)原因分析1:硬盘产生坏区,无法正常启动Windows系统 解决方法:格式化C盘,重新安装Windows系统和应用程序 (2)原因分析2:系统中病毒 解决方法:使用杀毒软件清除病毒。 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 《Java语言程序设计》课程设计报告 题 目:设 计 者:班 级:学 号:指导教师:系 部:专 业: ATM机 何珍珍 张明月 10信息一班 210510113 210510152 魏艳铭 信息管理系 计算机应用技术 2011年 月 25 日 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 ATM机设计报告 目录 概述..........................................................................................................................................2 1.1 问题分析..........................................................................................................................2 1.2功能..................................................................................................................................2 2 总体设计...................................................................................................................................3 3 详细设计...................................................................................................................................3 1.登录界面Client()类结构介绍:........................................................................................3 2.卡号生成界面AtmDemo()类结构介绍:.................................................错误!未定义书签。3.功能界面Main()类结构介绍:.........................................................................................4 4.存款的界面KeepMoney()和取款的界面GetMoney()结构介绍:...................................4 5.修改密码界面Change()类结构介绍:.................................................错误!未定义书签。7.查询余额界面Yuxia.java()类结构介绍:...............................................................................5 4 实现..........................................................................................................................................5 1.运行环境.........................................................................................................................5 2.运行情况抓图..................................................................................................................5 5 总结与体会................................................................................................................................7 6 参考文献...................................................................................................................................7 7 附录: 程序清单.........................................................................................错误!未定义书签。 概述 1.1 问题分析 模拟ATM机基本操作功能:存款、取款、余额查询、修改密码等;初始账户10000元;修改密码时必须修改两次,确认后才可使用;取款的款项和存款的款项必须是100的整倍数; 1.2功能 1)模拟ATM机实现当用户进入登陆页面后,用户需先点击银行开户按钮进行银行开户; 2)进入银行开户页面之后,进行填写客户信息,系统会自动生成卡号,信息填写完整后系统会自动保存用户信息在生成的文件中,并返回登陆页面进行登录。 3)登陆成功之后进入ATM机操作页面进行存款、取款、余额查询、修改密码,点击一个按钮都会显示出对应的页面。河南经贸职业学院信息管理系《Java程序设计》课程设计报告 总体设计 1、Client()类第一个登陆页面主要包括:登陆账号按钮、银行开户按钮、重新登录按钮、退出系统按钮; 2、AtmDemo()类第二个登陆页面主要进行用户资料填写主要包括:卡号、密码、确认密码、用户名、性别、存款金额标签;生成卡号、确认开户、取消开户按钮; 3、Main()类第二个登陆页面主要设置安放按钮,主要包括:取款、存款、修改密码、查询余额、退出该界面按钮并对所有按钮进行监听; 4、GetMoney()类第三个登陆页面主要进行取款设置主要包括:提款金额数目的数字按钮,当点击相应的按钮时,提取金额框内显示相应的取款金额;当提款的金额超出卡内总金额时,取款失败; 5、KeepMoney()类第四个登陆页面主要进行存款设置主要包括:存款金额数目的数字按钮,当点击相应的按钮时,存款金额框内显示相应的存款金额; 6、Change()类第五个登陆页面主要进行密码修改的设置主要包括:设置“确认”“取消”“返回主页面”三个按钮;两次输入新的密码,当两次密码相同时点击“确认”按钮修改密码成功,第二次进行账户登录时使用修改后的密码 7、Yuxia()类第六个登陆页面主要进行余额查询的设置主要包括:当点击“查看余额”按钮时查看存款、取款后卡内的总金额,显示在文本框内;当点击“返回主页面”时返回Main页面; 8、Account()类主要保存文件的卡号,密码和账户金额,对进行数据信息在不同的类内调用传递; 详细设计 1.登录界面Client()类结构介绍: 主要包括:三个标签:“欢迎登录ATM机”,“卡号”,“密码” 两个文本框:JTextField和JPasswordField四个按钮:“登陆账号”,“银行开户”,“重新登录”,“退出系统”对页面使用了空布局。对文本框进行监听,设置卡号只能为数字,且只能输入8位。设置密码框不为空。给四个按钮创建监听ActionListener,四个按钮实现的功能: 登陆账号:第一次进入登录界面时,当点击“登录账户”弹出对话框:“请进行银行开户”。 重新登录: 当点击“重新登录”按钮,用setText(“”)把文本框和密码框为空。 银行开户: 当点击“银行开户”按钮时,界面跳到银行开户的界面里。 退出系统:当点击“退出系统”时,弹出对话框“确定要退出ATM系统?”点击是,退出系统,点击否,留在该界面。 当银行开户成功后,再次输入卡号和密码,如果其中一个或全部错误,弹出对话框:河南经贸职业学院信息管理系《Java程序设计》课程设计报告 “请核对你的卡号和密码,重新登录”,并不设置文本框为空。2.卡号生成界面AtmDemo()类结果介绍: 继承Jframe创建银行卡号开户窗体,创建监听;应用空布局设置JLabel标签,JTextField, JPasswordField,JButton,JComboBox复选按钮框在窗体中的位置当点击“生成卡号”按钮时系统会自动生成卡号(inti=(int)(Math.random()*100000000);)对生成的卡号进行数据保存(account)由Account传递到登陆页面,让生成的卡号与登陆的卡号相同在登录页面进行登录操作; 设置密码与确认密码框中的内容相等,如果不相同提示(“JOptionPane.showConfirmDialog(this,“两次填写密码不同,请重新输入正确的密码!”,“提示”,JOptionPane.OK_CANCEL_OPTION);”),对生成的密码进行数据保存(account)让后传递到ATM—Client页面进行密码连接; 设置存款金额框存款金额为100的整倍数;当点击“取消开户”按钮时,所有文本框内容为空;当点击“确认开户”按钮时,如果资料填写不完整,系统进行提示(elseif(jtf1.getText().equals(“")||jtf2.getText().equals(”“)||jtf3.getText().equals(”“)||s3.equals(”“)||s2.equals(”“)){ JOptionPane.showMessageDialog(this,”开户失败,资料没填写完整!“);)反之,页面转到登陆页面; 3.功能界面Main()类结构介绍: 主要包括:一个标签:“荷塘月色ATM机正在为您服务…”五个按钮:“取款”、“存款”、“查询余额”、“修改密码”、“退出该界面”对页面使用了空布局。 对前四个按钮进行监听,当点击其中任一个按钮时,进入到该按钮实现功能的界面里,当点击“退出该界面”,弹出对话框“确定返回登录面?” 点击是,退出该界面,点击否,留在该界面。 4.存款的界面KeepMoney()和取款的界面GetMoney()结构介绍: 主要包括:十个按钮:七个固定存取款钱数的按钮和一个“自定义”(存取款的钱数)按钮,还有“确定”按钮和“返回主页面”的按钮。一个标签:“您提取(存入)的金额数:一个文本框;对页面使用了空布局。给八个存取款的按钮进行监听。实现的功能: 当点击七个固定存取款的按钮时,按钮上的钱数显示在文本框中,当点击自定义按钮时,可以在文本框中手动输入钱数。 当点击“返回主页面”按钮时,结束该界面的操作,返回Main页面里。 文本框:① 文本框设置为不可编辑。当点击存取款按钮时,钱数显示在文本框中,但不能手动修改文本框中的内容。当点击自定义按钮时,文本框可以手动输入,文本框中输入的存取款的钱数必须是100的倍数,最少为100,最多为5000元,否则弹出对话框进行提醒,存取钱不成功。 ② 自定义一个监听类,对文本框进行监听,自定义输入钱数时,文本框中只能输入数字,且最多可输入四位数。当文本框为空时,点击“确定”按钮,弹出对话框:“请输河南经贸职业学院信息管理系《Java程序设计》课程设计报告 入存(取)款金额”。 在存款KeepMoney.java界面时,当点击“确定”按钮,弹出对话框“您已存款**元,余额为**元”。 在取款GetMoney.java界面时,当点击“确定”按钮时,如果账户金额大于或等于提取金额时,弹出对话框“您已取款**元,余额为**元”。如果账户金额小于提取金额时,弹出对话框“余额不足,取钱失败”,并获取余额数,停止金额的运算。以防止取款不成功,但已透支的现象。5.修改密码界面Change()类结构介绍: 继承JFrame创建修改密码窗体,设置窗体的空布局;对确认密码框进行监听和数据传递保存(account.setPwd(s2);)传递到Client()类内;当两次输入密码相同时点击“确认”按钮密码修改成功,下次登录使用新密码进行登录。;点击“取消”按钮文本框内容消失为空;点击“返回主页面”按钮返回至Main()(else if(e.getSource()==jb3){new Main();this.setVisible(false);); 6.查询余额界面Yuxia.java()类结构介绍: 创建查询余额窗体,应用空布局设置布局;对按钮创建监听(addActionListener)当点击“查看余额”按钮时显示卡内当前的余额(运用Account类进行数据传递实现(jtf1.setText((account.getCountmoney())+”“);))实现 1.运行环境 MyEclipse6.5 2.运行情况抓图 2 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 4 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 总结与体会 此次实训基本把我们本学期所学的内容进行综合应用,让我们更加容易简单的了解体验到了未来工作的一般状况,锻炼了我们的实际操作能力,同时也在一定程度上增加了同学们对Java语言学习的信心,一些简单的小游戏,通过运用自己所学也是可以实现的,让我们不在对编程感觉那么神秘。 团队合作与交流很重要,“团结就是力量”在本次项目开发中真的体会得到,在做项目时,小组成员要知道本小组所做项目的基本构想框架,要做什么、实现什么。如果有自己的想法就要和自己的伙伴进行交流。参考文献 【1】魏艳铭,Java程序设计,河南经贸职业学院:ATM机视频提示,2011.6 【2】网络资源:http://www.xiexiebang.com/ 【3】《Java程序设计精讲》,北京:清华大学出版社,2010.9 7 附录:程序清单 1.Client.java//ATM机的登录界面 package client;import javax.swing.*;import client.GetMoney.myKeyListener;import java.awt.*;import java.awt.event.*;import java.net.URL;public class Client extends JFrame implements ActionListener{ JLabel jl1,jl2,jl3;JLabel jl;//添加图片的标签 JTextField jtf;JPasswordField jpf;JButton jb1,jb2,jb3,jb4;static Account account;public Client(Account account){ super(”ATM-Client“); this.account=account;setLayout(null); jl1=new JLabel(”欢迎进入“荷塘月色ATM 机”“);Font f=new Font(”华文新魏“,Font.BOLD,24);jl1.setForeground(Color.BLUE);jl1.setFont(f);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 jl2=new JLabel(”卡号:“);jl3=new JLabel(”密码:“);jtf=new JTextField(8);jtf.addKeyListener(new myKeyListener(jtf));jpf=new JPasswordField();jb1=new JButton(”登陆账号“);jb1.addActionListener(this);jb2=new JButton(”银行开户“);jb2.addActionListener(this);jb3=new JButton(”重新登录“);jb3.addActionListener(this);jb4=new JButton(”退出系统“);jb4.addActionListener(this); //添加图片 jl= new JLabel(); URL resource = this.getClass().getResource(”/images/6.jpg“); ImageIcon bgImage=new ImageIcon(resource);//创建图标 jl.setIcon(bgImage); jl.setBounds(0,0,400,400); jl1.setBounds(25, 40, 400, 40);jl2.setBounds(50, 85, 60, 40);jl3.setBounds(50, 150, 60, 40);jtf.setBounds(120, 90,150, 30);jpf.setBounds(120, 155,150,30);jb1.setBounds(0, 250, 90, 30);jb2.setBounds(100, 250, 90,30);jb3.setBounds(200, 250, 90,30);jb4.setBounds(300, 250, 90, 30); this.add(jl1);this.add(jl2);this.add(jtf);this.add(jl3);this.add(jpf);this.add(jb1);this.add(jb2);this.add(jb3);this.add(jb4);this.add(jl); this.setSize(400,400);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);public static void main(String[] args){ new Client(account);} public void actionPerformed(ActionEvent e){ if(e.getSource()==jb1){ } String s1=jtf.getText();String s2=new String(jpf.getPassword());if(s1.equals(account.ip)&&s2.equals(account.pwd)){ new Main(account);this.setVisible(false);}else{ } JOptionPane.showMessageDialog(this, ”请进行银行开户“);JOptionPane.showMessageDialog(this,”请核对您的卡号和密码,重新登录“);if(account!=null){ }else if(account==null){ }else if(e.getSource()==jb2){ //连接到的AtmDemo.java } //创建jtf的监听,使jtf只能输入8个数字,且只能输入数字 class myKeyListener extends KeyAdapter{ private JTextField jtf;private int length;new AtmDemo();this.setVisible(false);}else if(e.getSource()==jb3){ jtf.setText(”“);jpf.setText(”“);}else if(e.getSource()==jb4){ //设置jb4——退出系统 } int i=JOptionPane.showConfirmDialog(this,”您确定要退出ATM机系统?“, if(i==1){ } return;”提示“,JOptionPane.YES_NO_OPTION);System.exit(0);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } 2.AtmDemo.java//ATM卡号生成页面 package client;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.Socket;import java.util.Calendar;import java.net.URL;import javax.swing.*; public class AtmDemo extends JFrame implements ActionListener { JLabel jl1,jl2,jl3,jl4,jl5,jl6,jl7,jl8; JTextField jtf1,jtf2,jtf3;JPasswordField jpf1,jpf2;JButton jb1,jb2,jb3;JComboBox jcb;BufferedReader br;JLabel msg;Account account;int totalmoney=10000;int money; public AtmDemo(){ super(”银行卡号开户“);this.setLayout(null); } public myKeyListener(JTextField jtf){ } this.jtf = jtf;this.length = 8;public myKeyListener(JTextField jtf,int length){ this.jtf = jtf;} { } boolean b = Character.toString(e.getKeyChar()).matches(”d“);if(!b || jtf.getText().length()== length){ e.consume();} this.length = length;public void keyTyped(KeyEvent e)河南经贸职业学院信息管理系《Java程序设计》课程设计报告 jl1=new JLabel(”卡号开户“);jl2=new JLabel(”卡号:“);jl3=new JLabel(”密码 :“);jl4=new JLabel(”确认密码 :“);jl5=new JLabel(”用户名:“);jl6=new JLabel(”性别:“);jcb = new JComboBox(); jcb.addItem(”男“);jcb.addItem(”女“);jl7=new JLabel(”存款金额:“);jb1=new JButton(”生成卡号“);jb2=new JButton(”确认开户“); jb3=new JButton(”取消开户“); jtf1=new JTextField(16); jtf1.setEditable(false);//设置文本框不可见 jtf2=new JTextField(4); jtf3=new JTextField(); jpf1=new JPasswordField(6); jpf2=new JPasswordField(6); msg=new JLabel(”“); msg.setForeground(Color.RED); //监听 jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jtf3.addKeyListener(new myKeyListener(jtf3)); jl1.setForeground(Color.RED); jl1.setFont(new Font(”宋体“, Font.PLAIN, 40)); //添加图片 jl8= new JLabel(); URL resource = this.getClass().getResource(”/images/8.jpg“); ImageIcon bgImage=new ImageIcon(resource);//创建图标 jl8.setIcon(bgImage); jl8.setBounds(0,0,400,400); jl1.setBounds(105, 10, 225, 41);//卡号开户 jl2.setBounds(40, 60, 81, 18);//卡号 jb1.setBounds(297, 60, 91, 18);//生成卡号 jl3.setBounds(40, 90, 81, 18);//密码 jl4.setBounds(40, 120, 81, 18);//确认密码 jl5.setBounds(40, 150, 81, 18);//用户名 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 jl6.setBounds(40, 180, 81, 15);//性别 jcb.setBounds(100, 180, 110, 18);//复选按钮 jl7.setBounds(40, 210, 81, 15);//存款金额 jtf1.setBounds(100, 60, 190, 18);//卡号框 jpf1.setBounds(100, 90, 170, 18);//密码框 jpf2.setBounds(100, 120, 150, 18);//确认密码框 jtf2.setBounds(100, 150, 130, 18);//用户名框 jtf3.setBounds(100, 210, 90, 18);//存款金额框 jb2.setBounds(80, 300,100, 25);//确认开户 jb3.setBounds(230, 300, 100, 25);//取消开户 msg.setBounds(150,260,270,60); add(jb1); add(jb2); add(jb3);add(jcb);add(jl1);add(jl2);add(jl3);add(jl4);add(jl5);add(jl6);add(jl7);add(jpf1);add(jpf2);add(jtf1);add(jtf2);add(jtf3);add(msg);add(jl8); this.setSize(400,400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);} public static void main(String args[]){ new AtmDemo();} public void actionPerformed(ActionEvent e){ String id1=jtf1.getText();//卡号 String s1=new String(jpf2.getPassword());//确认密码 int mone=money;//生成的金额数 account=new Account(id1,s1,mone);//把生成的卡号、确认密码、生成金额数保存在河南经贸职业学院信息管理系《Java程序设计》课程设计报告 account类内 try{ //创建文件 File f=new File(”message.txt“); if(e.getSource()==jb1){ //生成卡号 jtf1.setEditable(true); int i=(int)(Math.random()*100000000); jtf1.setText(Integer.toString(i)); jtf1.setEditable(false); msg.setText(”“);//消失信息提示 JOptionPane.showMessageDialog(this,”卡号已生成,请记住卡号,以便登陆!“); } else if(e.getSource()==jb2){ //确定开户 String s3=new String(jpf1.getPassword());String s2=new String(jpf2.getPassword()); if(!s3.equals(s2)){ } JOptionPane.showConfirmDialog(this,”两次填写密码不同,请重新输入正确的密码!“,”提示“,JOptionPane.OK_CANCEL_OPTION);jpf2.setText(null); return; else if(jtf1.getText().equals(”“)||jtf2.getText().equals(”“)||jtf3.getText().equals(”“)||s3.equals(”“)||s2.equals(”“)){ JOptionPane.showMessageDialog(this,”开户失败,资料没填写完整!“); } else if(Integer.parseInt(jtf3.getText())%100!=0){ JOptionPane.showMessageDialog(this,”存款金额必须是100的倍数!“); jtf3.setText(”“);} else if(!jtf1.getText().equals(”“)&&!jtf2.getText().equals(”“)&&!jtf3.getText().equals(”“)&&!s3.equals(”“)&&!s2.equals(”“)){ } money=totalmoney+(Integer.parseInt(jtf3.getText())); JOptionPane.showMessageDialog(this,”您已开户成功,卡内金额为:“+money);account.setCountmoney((totalmoney+(Integer.parseInt(jtf3.getText()))));new Client(account);this.setVisible(false);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 //写入客户信息保存在message.txt中 try{ FileWriter fw = new FileWriter(f); BufferedWriter bw=new BufferedWriter(fw); String s = ”卡号:“+jtf1.getText()+”t“+”用户名:“+jtf2.getText()+”t“ +”密码:“+account.getPwd(); bw.write(s); bw.newLine(); bw.close(); fw.close(); }catch(IOException ex){ ex.printStackTrace();} } else if(e.getSource()==jb3){ jpf1.setText(null); } //只允许输入数字的监听器 class myKeyListener extends KeyAdapter{ private JTextField jtf;private int length; public myKeyListener(JTextField jtf){ this.jtf = jtf;} } public void keyTyped(KeyEvent e){ this.length = 15; } jpf2.setText(null); jtf1.setText(null); jtf2.setText(null); jtf3.setText(null); msg.setText(”您已成功取消开户!“); } }catch(Exception ex){ } public myKeyListener(JTextField jtf,int length){ this.jtf = jtf;this.length = length;河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } boolean b = Character.toString(e.getKeyChar()).matches(”d“);if(!b || jtf.getText().length()== length){ e.consume();} } 3.Main.java//主要包括:存款、取款、修改密码、查询余额等按钮 package client;import java.awt.*;import java.awt.event.*;import java.net.URL;import javax.swing.*; public class Main extends JFrame implements ActionListener{ JLabel jl1; JLabel jl;JButton jb1,jb2,jb4,jb5,jb6;static Account account;public Main(Account account){ super(”ATM机主页面“); this.account=account;setLayout(null); jl1=new JLabel(”荷塘月色ATM机正在为您服务...“);jl1.setBounds(50, 0,300, 80);Font f=new Font(”华文琥珀“,Font.BOLD,20);jl1.setForeground(Color.BLUE);jl1.setFont(f); jb1=new JButton(”取款“);jb1.addActionListener(this); jb2=new JButton(”查询余额“);//设置初始账户金额为1000元 jb2.addActionListener(this);jb4=new JButton(”存款“);jb4.addActionListener(this); jb5=new JButton(”修改密码“);jb5.addActionListener(this); jb6=new JButton(”退出该界面“);jb6.addActionListener(this);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } public void actionPerformed(ActionEvent e){ if(e.getSource()==jb1){ new GetMoney(account);this.setVisible(false);}else if(e.getSource()==jb2){ new Yuxia(account);this.setVisible(false);}else if(e.getSource()==jb4){ new KeepMoney(account);this.setVisible(false);new Change(account);this.setVisible(false);this.setSize(400,400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true); //添加图片 jl= new JLabel(); URL resource = this.getClass().getResource(”/images/6.jpg“); ImageIcon bgImage=new ImageIcon(resource);//创建图标 jl.setIcon(bgImage); jl.setBounds(0,0,400,400); jb1.setBounds(10,110 ,140 ,40);jb2.setBounds(10,190 ,140 ,40);jb4.setBounds(200, 110, 140, 40);jb5.setBounds(200, 190, 140,40);jb6.setBounds(100, 270,140 ,40); this.add(jl1);this.add(jb1);this.add(jb2);this.add(jb4);this.add(jb5);this.add(jb6);this.add(jl);}else if(e.getSource()==jb5){ }else if(e.getSource()==jb6){ int i=JOptionPane.showConfirmDialog(this,”确定要返回登陆界面?“,”提示“,JOptionPane.YES_NO_OPTION);if(i==1){ 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } 4.GetMoney.java//取款页面 package client;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.net.URL; public class GetMoney extends JFrame implements ActionListener{ JButton jb1,jb2,jb3,jb4,jb5,jb6,jb7,jb8,jb9,jb10;JLabel jl;JLabel jl1;JTextField jtf;int a=0;static Account account;public GetMoney(Account account){ super(”提取现金“);this.account=account;setLayout(null); jb1=new JButton(”100“);jb1.addActionListener(this); jb2=new JButton(”300“);jb2.addActionListener(this); jb3=new JButton(”500“);jb3.addActionListener(this); jb4=new JButton(”1000“);jb4.addActionListener(this); jb5=new JButton(”1500“);jb5.addActionListener(this); } return;} new Client(account);this.setVisible(false);} public static void main(String[] args){ } new Main(account);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 jb6=new JButton(”3000“);jb6.addActionListener(this); jb7=new JButton(”自定义“);jb7.addActionListener(this); jb8=new JButton(”5000“);jb8.addActionListener(this); jb9=new JButton(”确定“);jb9.addActionListener(this); jb10=new JButton(”返回主页面“);jb10.addActionListener(this); jl=new JLabel(”您提取的金额数为:“);jtf=new JTextField(4);jtf.addKeyListener(new myKeyListener(jtf));//设置文本框不可手动输入 jtf.setEditable(false); //添加图片 jl1= new JLabel(); URL resource = this.getClass().getResource(”/images/6.jpg“); ImageIcon bgImage=new ImageIcon(resource);//创建图标 jl1.setIcon(bgImage); jl1.setBounds(0,0,400,400); jb1.setBounds(20, 40, 100,40);jb2.setBounds(20, 90,100 ,40);jb3.setBounds(20,140 ,100 ,40);jb4.setBounds(280,40 ,100 ,40);jb5.setBounds(280,90 ,100 ,40);jb6.setBounds(280,140 ,100 ,40);jb7.setBounds(20, 190, 100, 40);jb8.setBounds(280, 190, 100, 40);jb9.setBounds(50,290,100, 40);jb10.setBounds(250,290,100,40);jl.setBounds(20, 240, 150,40);jtf.setBounds(180, 250, 100,20); this.add(jb1);河南经贸职业学院信息管理系《Java程序设计》课程设计报告 } public void actionPerformed(ActionEvent e){ if(e.getSource()==jb1){ jtf.setText(jb1.getText());jtf.setEditable(false);jtf.setText(jb2.getText());}else if(e.getSource()==jb2){ jtf.setEditable(false);}else if(e.getSource()==jb3){ jtf.setText(jb3.getText());jtf.setEditable(false);this.add(jb2);this.add(jb3);this.add(jb4);this.add(jb5);this.add(jb6);this.add(jb7);this.add(jb8);this.add(jb9);this.add(jb10);this.add(jl);this.add(jtf);this.add(jl1); this.setSize(400,400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}else if(e.getSource()==jb4){ jtf.setText(jb4.getText());jtf.setEditable(false);}else if(e.getSource()==jb5){ jtf.setText(jb5.getText());jtf.setEditable(false);}else if(e.getSource()==jb6){ jtf.setText(jb6.getText());jtf.setEditable(false);jtf.setText(”“);jtf.setEditable(true);}else if(e.getSource()==jb7){ }else if(e.getSource()==jb8){ jtf.setText(jb8.getText());jtf.setEditable(false);}else if(e.getSource()==jb10){ 河南经贸职业学院信息管理系《Java程序设计》课程设计报告 new Main(account); this.setVisible(false);}else if(e.getSource()==jb9){ if(jtf.getText().equals(”“)){ JOptionPane.showMessageDialog(this,”请输入取钱金额!“); return;}else if(jtf.getText().charAt(0)== '0'){ JOptionPane.showMessageDialog(this,”请正确输入取钱金额!“);jtf.setText(”“);return; JOptionPane.showMessageDialog(this,”请输入100的整倍钱数!“);jtf.setText(”“);}else if(Integer.parseInt(jtf.getText())%100!=0){ }else if((Integer.parseInt(jtf.getText()))>5000){ JOptionPane.showMessageDialog(this,”最多取款5000元!“);jtf.setText(”“);}else if(jtf.getText()!=null){ String s=jtf.getText(); int a=Integer.parseInt(s);int b=account.getCountmoney();if(b>a||b==a){ account.setCountmoney(b-a); JOptionPane.showMessageDialog(this,”您已取款:“+s+”元。您余额为:“+account.getCountmoney()+”元“); } //创建jtf的监听,使jtf只能输入4个数字,且只能输入数字 class myKeyListener extends KeyAdapter{ public static void main(String[] args){ new GetMoney(account); } }第四篇:ATM取款机常见故障及解决方法
第五篇:ATM的java实训项目设计报告书