第一篇: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取款机 课程设计过程概述 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; 黄 淮 学 院 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自动取款机系统 ATM自动取款机(automatic teller machine)是银行在银行营业大厅、超市、商业机构、机场、车站、码头和闹市区设置的一种小型机器,利用一张信用卡大小的胶卡上的磁带〔或芯片卡上的芯片〕记录客户的基本户口资料,让客户可以透过机器进行提款、存款、转帐等银行柜台服务。这里介绍使用Rational Rose工具为ATM自动取款机系统进行建模。 5.1需求分析 ATM自动取款机系统的需求分析简述如下: (1)客户将银行卡插入读卡器,读卡器识别卡的真伪,并在显示器上提示输入密码。(2)客户通过键盘输入密码,取款机验证密码是否有效。如果密码错误提示错误信息,如果正确,提示客户进行选择操作的业务。 (3)客户根据自己的需要可进行存款、取款、查询账户、转账、修改密码的操作。(4)在客户选择后显示器进行交互提示和操作确认等信息。(5)操作完毕后,客户可自由选择打印或不打印凭条。 (6)银行职员可进行对ATM自动取款机的硬件维护和添加现金的操作。 5.2系统建模 在系统建模以前,我们首先需要在Rational Rose 2003中创建一个模型。并命名为“ATM自动取款机系统”,该名称将会在Rational Rose 2003的顶端出现,如下图5-1所示。 图 5-1创建项目系统模型 5.2.1创建系统用例模型 创建系统用例的第一步是确定系统的参与者。考试成绩管理系统的参与者包含以下三种: (1)客户(2)银行职员(3)信用系统 三个参与者如图5-2所示。 图5-2 系统参与者 然后,我们根据参与者的不同分别画出各个参与者的用例图。 1.客户用例图:客户在本系统中可以进行取款、存款、转账、查询余额、修改密码和还款的相关操作,通过这些活动创建的客户用例图如图5-3所示。 图5-3 客户用例图 图5-4 银行职员用例图 2.银行职员用例图:银行职员在本系统中能够进行硬件维护、修改密码和添加现金的相关操作,通过这些活动创建的银行职员用例图如图5-4所示。 5.2.2创建系统静态模型 从前面的需求分析中,我们可以依据主要的九个类对象:ATM自动提款机、客户、银行职员、信用系统、数据库连接、银行账户、ATM屏幕、ATM键盘和ATM读卡器创建完整的类图如图5-5所示。 图 5-5 系统类图 5.2.3创建系统动态模型 系统的动态模型可以使用交互作用图、状态图和活动图来进行描述。 5.2.3.1 创建序列图和协作图 客户取款的活动步骤分为:(1)客户插入银行卡(2)读卡机读取卡号(3)初始化屏幕(4)读卡机打开账户并提示输入密码(5)用户输入密码(6)验证密码(7)屏幕提示选择操作(8)用户选择取款操作(9)银行账户扣除钱款(10)吐钱机提供钱和收据(11)用户取钱并退卡。根据以上步骤创建的序列图和协助图,如下图5-6和图5-7所示。 图5-6 客户取款序列图 图5-7 客户取款协作图 5.2.3.2 创建活动图 我们还可以利用系统的活动图来描述系统的参与者是如何协同工作的。ATM自动取款机系统中,根据用户开立新账户的步骤,我们可以创建活动图如下图5-12所示。 图5-12 系统活动图 图5-13 系统状态图 5.2.3.3 创建状态图 在ATM自动取款机系统中,有明确状态转换的类是银行账户,从账户的打开到账户关闭的过程,状态会发生明显的变化。创建后的系统状态图如下图5-13所示。 5.2.4创建系统部署模型 对系统的实现结构进行建模的方式包括两种,即构件图和部署图。ATM自动取款系统的构件图我们通过构件映射到系统的实现类中,说明该构件物理实现的逻辑类,在本系统中,我们可以对银行账户、信用系统、客户、ATM屏幕、ATM取款机、ATM键盘、银行职员、读卡器和数据库服务器分别创建对应的构件进行映射。ATM自动取款机系统的构件图如图5-14所示。 .图 5-14系统构件图 图5-15 系统部署图 ATM自动取款机系统的部署图描绘的是系统节点上运行资源的安排。包括了四个节点,分别是:ATM客户端、地区ATM服务器、银行数据库服务器和打印机。创建后的部署图如图5-15所示。 错把自己的钱存到别人卡里怎么办 看着银行ATM自助取款机的屏幕上,显示着有一笔5000元的现金入账。租住在金花路某小区的冯国光长长地舒了一口气,这件事总算解决了,7个月来,我也终于可以睡个踏实觉了。他高兴地说: 这件事还要从今年5月份的一天说起:那天下午冯国光来到某银行金花路支行的柜台前,准备将自己打工存下的5000元现金存起来。存钱的过程很顺利,冯国光从包里掏出一张银行储蓄卡和现金一起递给柜台工作人员。可是等银行工作人员拿出存款凭单,让冯国光签字确认的时候他发现了个大问题,凭条上显示的账户名称,不是我的名字,而是一个叫刘强的人。冯国光说当时他一下子就懵了。因为这个刘强他根本就不认识他,咋把钱存到了别人的卡上?在银行工作人员的询问下,冯国光才慢慢回忆起来这张银行卡是他从自己租住屋的床底下捡来的。因为他也有一张这个银行的借记卡所以还以为是自己不小心掉到床底下去的就直接把卡放到了自己的钱包里。 冯国光这下总算明白了自己把钱存到了别人卡上我该怎么办?冯国光顿时手足无措,只能一再要求银行的工作人员将这笔钱转存到自己卡上,银行工作人员了解到误存的事情经过后,表示按规定必须输入正确的密码才能取钱,或者找到银行卡的户主来取这笔钱,否则存入他人卡上的款项银行也无权处置 我不知道密码,最后只能先申请银行把这笔业务冻结之后,冯国光多次找这家银行和刘强,希望能把钱追回来,可一直没有解决,钱也不知所踪。无奈之下冯国光只好将这家银行和刘强起诉至新城区法院要求银行和刘强返还这笔存款。法院审理认为冯国光误持刘强的储蓄卡办理存款,属于民事法律行为中的重大误解,冯国光要求返还这笔存款符合法律规定,最终法院判决由刘强向冯国强返还5000元现金,银行协助办理。这就发生了文中开头的那一幕。 新城区法院民事审判庭王法官提醒说,市民在捡到别人丢失或者废弃的银行卡时,应该及时交到发卡银行尤其要注意在存款的过程中应仔细核对账号名称,账号数字以及存入金额等信息,避免此类事件的发生。他说如果误将钱款存入他人账户要注意收集相关证据。如打印交易凭条,同时向银行反映情况并申请财产保全保证钱款安全。 中国农业银行一位姓席的工作人员表示,万一在银行柜台或者通过ATM机存款和转账时发生失误,将钱存到他人账户时,市民应该在第一时间告知银行,可以找银行的工作人员协助处理,也可以拨打银行客服电话寻求帮助,同时必须向公安机关报案,由警方处理。如果对方拒不还款就必须通过司法程序解决,同时他提醒说持卡人可以在银行卡背面的签名栏里签上自己的名字,这样既可以提醒并避免拿错卡,另一方面也方便银行工作人员进行核对。第二篇:java实训 ATM取款机
第三篇:ATM取款机java课程设计
第四篇:uml 描述ATM自动取款机系统
第五篇:看着银行ATM自助取款机的屏幕上