第一篇:JAVA课程设计报告ATM存取款系统
目 录
1课程设计题目描述和基本设计要求...............................................................2 系统需求分析..................................................................................................2.1 功能需求分析 ······················································································
2.2 其他需求分析 ······················································································
3系统设计...........................................................................................................3.1 总体设计 ······························································································
3.2 ATM柜员机界面设计 ·········································································
3.3 各功能模块设计 ··················································································
3.3.1 登陆页面模块设计 ································································
3.3.2 选择服务模块设计 ································································
3.3.3 取款模块设计 ·······································································
3.3.4 退卡模块设计 ······································································· 3.4 异常处理情况说明 ·································································· 系统实现与测试..............................................................................................5总程序...............................................................................................................6 课程设计总结..................................................................................................6.1 遇到的问题及解决办法 ······································································
6.2 心得体会 ······························································································
ATM柜员机 课程设计题目描述和基本设计要求
ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。系统需求分析 2.1 功能需求分析
主要功能如下所述:
要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行:
查询余额:初始余额为50000元
ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。
ATM存款:不能出现负存款。
修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。
2.2 其他需求分析
(1)性能描述
实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束
开发工具:JCrator ProV3.5.0 运行环境:Windows 2000以上 能实现用户所定义的各项需求。(3)界面要求
以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。系统设计 3.1 总体设计
我所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示:
图1
ATM功能结构示意图
3.2 ATM柜员机界面设计
一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。
(1)窗体的设计
窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为:WindowBox(String s,Account act){super(“ATM柜员机”);}、Selection(String s,Account act){ } super(s);向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()来判断用户点击的菜单子项,并完成这个菜单子项定义的操作。
3.3 各功能模块设计 3.3.1 登陆页面模块设计
与ATM柜员机打交道比较多的,也是大家对安全比较关心的问题:密码。所以第一个界面就是要输入密码和卡号才能继续服务。
我定义了文本框累的对象tf1,tf2。抓药是用于输入单行的文本;文本区调用public String getText()方法,获取用户想要的字符串。用来判断输入的密码和卡号是否正确,如果不正确的话,则弹出密码或卡号错误的警告框,并用dispose()关掉窗口。
3.3.2 选择服务模块设计
在选择服务模块中,有各种ATM的服务功能,只要用户在该界面中选择按钮,它就会弹出各个相应的界面。每一个按钮都有监听器,在选择了按钮后,java.awt.event中的ActionEvent类创建一个事件对象,并将它传递给方法public void actionPerformed(ActionEvent e)中的参数e,监视器就会知道所发生的事件,对此事件进行处理。
3.3.3 取款模块设计
在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。3.3.4 退卡模块设计
在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出
} System.exit(0);dispose();这个方法就可以实现了,这里就不再多说了。
3.4 异常处理情况说明
(1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException(3)加载类时的异常处理
需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。
(4)加载URL时的异常
需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。系统实现与测试
(1)编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报右下图的错误。
图2 主界面—登陆页面
(2)选择服务界面效果
当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。
图3 选择服务界面
(3)取款界面,如图4所示。
图4 取款界面
(4)查询余额界面,如图7所示。
图7 查询余额界面
图8 存款界面
图9 转账界面
经过测试,所有的功能基本上都实现了,而且运行正常。.总程序
package ZDC;//主菜单
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel1 extends JPanel{ JLabel label1,label2;
Panel1(){
setLayout(new GridLayout(4,1));
label1=new JLabel(“
”+“银行存取款系统”);label2=new JLabel(“
”+“欢迎你成为本行用户,你可以选择中文或英文方式”);
add(new JLabel());add(label1);add(label2);add(new JLabel());
} } class Panel2 extends JPanel{
JButton button1,button2;
Panel2(){
setLayout(new GridLayout(3,6));
button1=new JButton(“中文”);button2=new JButton(“英文”);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client extends JFrame implements ActionListener{
Panel1 panel1;Panel2 panel2;JFrame frame;
Client(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel1();panel2=new Panel2();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==“中文”){
this.setVisible(false);
new Client00(“输入密码”);
}
else if(e.getActionCommand()==“英文”){String inputValue = JOptionPane.showInputDialog(“Please input a value”);}
} } public class menu{
public static void main(String []args){
new Client(“用户取款系统”);
}} package ZDC;
// 输入密码界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel01 extends JPanel{
JLabel label1,label2,label3,label4;JPasswordField textA;JTextField textC;
static JTextField textB;char t[]=new char[4];
Panel01(){
setLayout(new GridLayout(4,4));
for(int i=0;i<4;i++){t[i]=(char)(Math.random()*26+'a');}
String mm=new String(t);
label2=new JLabel(“请输入卡号:”);label1=new JLabel(“请输入密码:”);
label3=new
JLabel();label4=new
JLabel(“
请
输
入
验
证”);label3.setBackground(Color.white);
码
:
label3.setForeground(Color.red);
textC=new JTextField(10);textC.setForeground(Color.blue);
label3.setText(mm);
textA=new JPasswordField(6);textA.setEchoChar('*');textB=new JTextField(“");
for(int i=0;i<5;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());add(new JLabel());
add(label1);add(textA);add(new JLabel());add(new JLabel());
add(label4);add(textC);add(label3);
} } class Panel02 extends JPanel{ JButton button1,button2;
Panel02(){
setLayout(new GridLayout(3,6));
button1=new JButton(”确定“);button2=new JButton(”取消“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new JLabel());
add(button2);for(int i=0;i<6;i++){add(new JLabel());}
} } class Client00 extends JFrame implements ActionListener{
Panel01 panel1;Panel02 panel2;JFrame frame;int i=0,j=0;
Client00(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel01();panel2=new Panel02();
con.add(panel1);con.add(panel2);
JLabel());add(new
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
char[] passwords=panel1.textA.getPassword();String password=new String(”000000“);
//设置账号123456789的初始密码为112626,每输入一次都有提示,在连续输入三次不正确后系统自动退出。
”);}
if(e.getActionCommand().equals(“确定”))
if(panel1.textC.getText().equals(panel1.label3.getText())){
heshi();
}
else{JOptionPane.showMessageDialog(frame,“你输入的验证码有误,请重新输入。
else if(e.getActionCommand()==”取消“){this.setVisible(false);new Client08(”“);}
}
public void heshi(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
请输入账号、密码!“);return;} try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();
String ql=panel1.textB.getText();
ResultSet rs=sql.executeQuery(”select cnima from card where cno=“+ql+”“);
if(rs.next()){
String qerycmima=panel1.textA.getText();
String s=rs.getString(1);
if(qerycmima.equals(s)){
JOptionPane.showMessageDialog(frame,”
连接成功!“);
this.setVisible(false);new Client01(”用户取款系统“);
}else{ if(i!=2){i++;j=3-i;
JOptionPane.showMessageDialog(frame,”密码有误!你还有“+j+”次机会,请你再仔细想想.“);
panel1.textA.setText(”“);}
else {JOptionPane.showMessageDialog(frame,”对不起,你输入的密码次数达三次,下次再见。“);System.exit(0);}
}
con.close();frame.repaint();
}
else{JOptionPane.showMessageDialog(null,”
该用户不存在,重新输入!“,”警告!“, JOptionPane.YES_NO_OPTION);
panel1.textA.setText(”“);panel1.textB.setText(”“);panel1.textC.setText(”“);return;}
}catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage());
} catch(Exception e){ e.printStackTrace();
}
} } class Inputpassword{
public static void main(String []args){
new Client00(”用户取款系统“);
}} package ZDC;//选择界面
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel03 extends JPanel{
”);
for(int i=0;i<7;i++){add(new
JLabel());}add(button1);add(new
JLabel());add(new
JButton button1,button2,button3,button4,button5;
Panel03(){
setLayout(new GridLayout(8,6));
button1=new JButton(“查询”);button2=new JButton(“取款”);
button3=new JButton(“转账”);button4=new JButton(“退出”);button5=new JButton(“存款JLabel());
add(button2);for(int
i=0;i<8;i++){add(new
JLabel());}add(button3);add(new JLabel());add(new JLabel());add(button5);
for(int i=0;i<17;i++){add(new JLabel());}add(button4);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client01 extends JFrame implements ActionListener{
Panel03 panel1;JFrame frame;
Client01(String s){
super(s);
Container con=this.getContentPane();
panel1=new Panel03();con.add(panel1);
panel1.button1.addActionListener(this);panel1.button2.addActionListener(this);
panel1.button3.addActionListener(this);panel1.button4.addActionListener(this);panel1.button5.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”取款“){
this.setVisible(false);
new Client02(”请选择取款金额“);
}
else if(e.getActionCommand()==”查询“){
this.setVisible(false);
new Client06(”查询服务“);
}
else if(e.getActionCommand()==”存款“){
this.setVisible(false);
new Client05(”请选择存款金额“);
}
else if(e.getActionCommand()==”转账“){
this.setVisible(false);
new Client04(”用户转账服务“);
}
else if(e.getActionCommand()==”退出“){ this.setVisible(false);new Client08(”“);}
} } class Selectfunction{
public static void main(String []args){
new Client01(”用户取款系统“);
new Client01(”用户存款系统“);
} } package ZDC;//查询功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel06 extends JPanel{
JLabel label1,label2;JTextField textA;JFrame frame;
Panel06(){
setLayout(new GridLayout(4,4));label1=new JLabel(”你的余额为:“);
textA=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<9;i++){add(new JLabel());}
} } class Panel07 extends JPanel{
JButton button1,button2;
Panel07(){
setLayout(new GridLayout(3,6));
button1=new JButton(”继续“);button2=new JButton(”查询“);
for(int i=0;i<7;i++){add(new
JLabel());}add(button2);add(new JLabel());
add(button1);for(int i=0;i<7;i++){add(new JLabel());}
} } class Client03 extends JFrame implements ActionListener{
Panel06 panel1;Panel07 panel2;
Client03(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel06();panel2=new Panel07();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
JLabel());add(new
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”继续“)){
this.setVisible(false);
new Client01(”选择服务种类“);
}
else if(e.getActionCommand()==”查询“)showcjine();
}
public void showcjine(){
//String
url
=
”jdbc:odbc:driver={Microsoft
Access
Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);
if(rs.next()){
String ucjine=rs.getString(1);
panel1.textA.setText(ucjine);
}
else{JOptionPane.showMessageDialog(null,”
该用户不存在“,”警告!“, JOptionPane.YES_NO_OPTION);}
con.close();
}catch(Exception ex){ ex.printStackTrace();
}
}
} class Searchfunction{
public static void main(String []args){
new Client03(”用户查询服务“);
}} package ZDC;
//查询信息
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;import java.awt.event.*;class Panel11 extends JPanel{
JButton button1,button2;
Panel11(){
setLayout(new GridLayout(10,5));
button1=new JButton(”查询余额“);
button2=new JButton(”查本卡信息“);
for(int i=0;i<=16;i++)add(new JLabel());
add(button1);
for(int i=0;i<=13;i++)add(new JLabel());
add(button2);
for(int i=0;i<=16;i++)add(new JLabel());} }
class Client06 extends JFrame implements ActionListener{
Panel11 panel11;JFrame frame;
Client06(String s){
super(s);
Container con=this.getContentPane();
panel11=new Panel11();
con.add(panel11);
panel11.button1.addActionListener(this);
panel11.button2.addActionListener(this);
this.setVisible(true);this.pack();}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand()==”查询余额“){
this.setVisible(false);
new Client03(”用户查询服务“);
}
else if(e.getActionCommand()==”查本卡信息“){ this.setVisible(false);
new Client07(”本卡信息“);
} } } class Searchinformation{
public static void main(String []args){
new Client06(”查询服务“);
} } package ZDC;//转账功能
import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*;
import ZDC.Panel01;
import java.awt.event.*;class Panel08 extends JPanel{
JLabel label1,label2;JTextField textA,textB;
Panel08(){
setLayout(new GridLayout(4,4));
label1=new JLabel(”输入预转账号:“);label2=new JLabel(”输入预转金额:“);
textA=new JTextField(6);textB=new JTextField(6);
for(int i=0;i<5;i++){add(new JLabel());}
add(label1);add(textA);for(int i=0;i<6;i++){add(new JLabel());}
add(label2);add(textB);add(new JLabel());
} } class Panel09 extends JPanel{
JButton button1,button2;
Panel09(){
setLayout(new GridLayout(3,6));
button1=new JButton(”确定“);button2=new JButton(”取消“);
add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(button1);add(new JLabel());add(new JLabel());
add(button2);add(new JLabel());add(new JLabel());add(new JLabel());add(new JLabel());
add(new JLabel());add(new JLabel());add(new JLabel());
} } class Client04 extends JFrame implements ActionListener{
Panel08 panel1;Panel09 panel2;JFrame frame;
Client04(String s){
super(s);
Container con=this.getContentPane();
con.setLayout(new GridLayout(2,1));
panel1=new Panel08();panel2=new Panel09();
con.add(panel1);con.add(panel2);
panel2.button1.addActionListener(this);
panel2.button2.addActionListener(this);
this.setVisible(true);this.pack();
}
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(”确定“)){ zhuanzhang();//程序根据输入账号调用数据库,修改对应金额数。
this.setVisible(false);
new Client01(”用户取款系统“);
}
else if(e.getActionCommand()==”取消“){
this.setVisible(false);
new Client01(”用户取款系统“);}
}
public void zhuanzhang(){
if(panel1.textA.getText().equals(”“)||panel1.textB.getText().equals(”“)){JOptionPane.showMessageDialog(frame,”
请输入欲转账号、金额!“);return;} //String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件
try{
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String cno=panel1.textA.getText();String ql=Panel01.textB.getText();
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);
ResultSet ss=sql.executeQuery(”select cno from card where cno=“+cno+”“);String yjine=panel1.textB.getText();
int shjin=Integer.parseInt(yjine);
if(ss.next()){
ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String queryjine=rs.getString(1);
int qyjine=Integer.parseInt(queryjine);
if(shjin String newjine=String.valueOf(newcjine);String newjine2=String.valueOf(newcjine2); sql.executeUpdate(”update card set cjine='“+newjine+”'where cno=“+ql+”“); sql.executeUpdate(”update card set cjine='“+newjine2+”'where cno=“+cno+”“);JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);this.setVisible(false);new Client01(”用户取款系统“); } else{JOptionPane.showMessageDialog(null,” 请重新输入金额!“,”警告!“, JOptionPane.YES_NO_OPTION); panel1.textB.setText(”“);return; } con.close();frame.repaint(); } con.close();frame.repaint(); } else{JOptionPane.showMessageDialog(null,” 警告!“, JOptionPane.YES_NO_OPTION);panel1.textA.setText(”“);} }catch(Exception ex){ ex.printStackTrace(); } } } class Transferfunction{ public static void main(String []args){ new Client04(”用户转账服务“);}} package ZDC;//用户取款 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; 该用户不存在,请重新输入。”,“ import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel04 extends JPanel{ JButton button1,button2,button3,button4; Panel04(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel05 extends JPanel{ JButton button1,button2,button3,button4; Panel05(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client02 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client02(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); qukuan();//程序根据输入金额和输入卡号,修改数据库。 new Client01(”用户取款系统“); } else if(e.getActionCommand()==”200“){ else if(e.getActionCommand()==”300“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”500“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”800“){ this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} else if(e.getActionCommand()==”1000“){ } public void qukuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText(); this.setVisible(false); qukuan(); new Client01(”用户取款系统“);} ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“);if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);if(queryjine if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);} this.setVisible(false); new Client01(”用户取款系统“); } else{JOptionPane.showMessageDialog(null,” 你的卡余额已不足,请注意!“,”警告!“, JOptionPane.YES_NO_OPTION); } con.close(); frame.repaint(); } }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Withdraw{ public static void main(String []args){ new Client02(”请选择取款金额“); } } this.setVisible(false);new Client01(”用户取款系统“);package ZDC; //存款功能 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*;class Panel10 extends JPanel{ JButton button1,button2,button3,button4; Panel10(){ setLayout(new GridLayout(4,6)); button1=new JButton(”100“);button2=new JButton(”200“); button3=new JButton(”300“);button4=new JButton(”500“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<8;i++){add(new JLabel());}add(button3);add(new JLabel()); add(new JLabel());add(button4);add(new JLabel()); } } class Panel14 extends JPanel{ JButton button1,button2,button3,button4; Panel14(){ setLayout(new GridLayout(4,6)); button1=new JButton(”800“);button2=new JButton(”1000“); for(int i=0;i<7;i++){add(new JLabel());}add(button1);add(new JLabel());add(new JLabel()); add(button2);for(int i=0;i<13;i++){add(new JLabel());} } } class Client05 extends JFrame implements ActionListener{ Panel04 panel1;Panel05 panel2;JFrame frame; Client05(String s){ super(s); Container con=this.getContentPane(); con.setLayout(new GridLayout(2,1)); panel1=new Panel04();panel2=new Panel05(); con.add(panel1);con.add(panel2); panel1.button1.addActionListener(this);panel1.button2.addActionListener(this); panel1.button3.addActionListener(this);panel1.button4.addActionListener(this); panel2.button1.addActionListener(this);panel2.button2.addActionListener(this); this.setVisible(true);this.pack(); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”100“){ this.setVisible(false); cunkuan();//程序根据输入金额和输入卡号,修改数据库。 new Client01(”用户存款系统“); } else if(e.getActionCommand()==”200“){this.setVisible(false);new Client01(”用户存款系统“);} //这里当点击取款金额200时,程序返回上层操作界面。 } public void cunkuan(){ try{ Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);Connection con=DriverManager.getConnection(”jdbc:odbc:hello“,”“,”“);//连接数据库 Statement sql=con.createStatement();String ql=Panel01.textB.getText();ResultSet rs=sql.executeQuery(”select cjine from card where cno=“+ql+”“); if(rs.next()){ String mm=rs.getString(1);int nn= Integer.parseInt(mm); String qerycjine=panel1.button1.getActionCommand(); int queryjine=Integer.parseInt(qerycjine);int newjine=nn+queryjine;String newjin=String.valueOf(newjine);int updateMima=sql.executeUpdate(”update card set cjine='“+newjin+”'where cno=“+ql+”“); if(updateMima==1){ JOptionPane.showMessageDialog(frame,” 操作已成功,谢谢使用!“);} this.setVisible(false); new Client01(”用户存款系统“); } else{JOptionPane.showMessageDialog(null,” 请注意!“,”警告!“, JOptionPane.YES_NO_OPTION); this.setVisible(false);new Client01(”用户取款系统“);} con.close(); frame.repaint(); }catch(SQLException g){ System.out.println(”E Code“+g.getErrorCode());System.out.println(”E M“+g.getMessage()); } catch(Exception e){ e.printStackTrace(); } } } class Depositfunction{ public static void main(String []args){ new Client05(”请选择存款金额“); } } package ZDC;//显示用户信息 import java.awt.*;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import ZDC.Panel01; import java.awt.event.*; class Panel12 extends JPanel{ JLabel label1,label2,label3,label4; JButton button1,button2;JTextField text1,text2,text3,text4; Panel12(){ setLayout(new GridLayout(9,6)); label1=new JLabel(”显示用户名:“);label2=new JLabel(”显示性别:“); label3=new JLabel(”显示身份证:“);label4=new JLabel(”显示卡号:“); button1=new JButton(”查询“);text1=new JTextField(”“);text2=new JTextField(”“); button2=new JButton(”取消“);text3=new JTextField(”“);text4=new JTextField(”“); for(int i=0;i<8;i++)add(new JLabel());add(label1);add(text1); for(int i=0;i<4;i++)add(new JLabel());add(label2);add(text2); for(int i=0;i<4;i++)add(new JLabel());add(label3);add(text3); for(int i=0;i<4;i++)add(new JLabel());add(label4);add(text4); for(int i=0;i<15;i++)add(new JLabel());add(button1); add(new JLabel());add(new JLabel());add(button2); for(int i=0;i<7;i++)add(new JLabel());} } class Client07 extends JFrame implements ActionListener{ Panel12 panel12;JFrame frame; Client07(String s){ super(s); Container con=this.getContentPane(); panel12=new Panel12(); con.add(panel12); panel12.button1.addActionListener(this); panel12.button2.addActionListener(this); this.setVisible(true);this.pack();} public void actionPerformed(ActionEvent e){ if(e.getActionCommand()==”查询“)showCard(); else if(e.getActionCommand()==”取消“){ this.setVisible(false); new Client01(”用户取款系统“); } } public void showCard(){ String url = ”jdbc:odbc:driver={Microsoft Access Driver(*.mdb)};DBQ=bankSystem.mdb“;//程序直接使用当前类目录下的数据库文件 try{ Connection con=DriverManager.getConnection(url);Statement sql=con.createStatement();String ql=Panel01.textB.getText();Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);ResultSet rs=sql.executeQuery(”select * from user where ucno=“+ql+”“); if(rs.next()){ String uname=rs.getString(1); String usex=rs.getString(2); String uid=rs.getString(3); String ucno=rs.getString(4); panel12.text1.setText(uname); panel12.text2.setText(usex); panel12.text3.setText(uid); panel12.text4.setText(ucno);} else{JOptionPane.showMessageDialog(null,” 该用户不存在“,”警告!“, JOptionPane.YES_NO_OPTION);} con.close(); } catch(Exception ex){ ex.printStackTrace(); } } } class Dislayuserinformation{ public static void main(String []args){ new Client07(”本卡信息“); } } package ZDC;//退出功能 class Client08{ static Athread threadA; Client08(String s){ threadA=new Athread(); threadA.start(); } } class Athread extends Thread{ static int j=1;public void run(){ for(;j<2;){ new Client08(”提示退出对话框“);try{sleep(30000);j++;} catch(InterruptedException e){} } System.exit(0);} } public class Exit{ public static void main(String []args){ new Client08(”“); } } package ZDC;//退卡 import java.awt.*;import java.sql.Connection; import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.swing.*; import java.awt.event.*;class Panel13 extends JPanel{ JLabel label; Panel13(){ label=new JLabel(” 此卡! “); setLayout(new GridLayout(10,1));add(new JLabel()); add(label);for(int i=0;i<6;i++)add(new JLabel());} } class Client09 extends JFrame{ Panel13 panel13; Client09(String s){ super(s); Container con=this.getContentPane(); panel13=new Panel13(); con.add(panel13); this.setVisible(true);this.pack();} } class bankSystem09{ 谢谢使用,请在30秒内退出 JLabel());add(new JLabel());add(new public void main(String []args){ new Client08(”提示退出对话框"); } } 6课程设计总结 6.1 遇到的问题及解决办法 在此次课程设计中,我遇到了一些问题,如:对于面向对象的方法了解不够透彻,运用到实际的软件开发中存在着困难;对于Java语言,只学习到了一些最基本的知识,这导致编写程序时经常出现一些语法错误,而且要在短时间内用Java语言来设计一个具体的系统是一个较大的挑战。对于以上的问题,自己有清楚的认识,解决办法是需要大量阅读相关的书籍,对于书上以及网站上下载的资料中的Java实例必须有清楚的理解。对于实际动手能力与系统开发的流程的适应,必须多进行实际的练习与操作,才能有大的进步。 6.2 心得体会 在这次的课程设计中,我主要运用了Java语言的界面设计、异常处理、、Awt控件、Swing控件,输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。在以后的学习当中,我会更加努力的学习好专业知识,并将所学的知识用于实践当中去,以便牢固掌握知识。 《Java语言程序设计》 课程设计报告 题 目: ATM柜员机 专 业: 信息与计算科学 学 号: 姓 名: 单 焱 指导教师: 李 又 良 成绩: 2010 年 12 月 10 日 目 录 1课程设计研究背景及意义.......................................2 2 课程设计题目描述和基本功能设计要求...........................2 3 系统需求分析.................................................2 3.1 功能需求分析............................................2 3.2 其他需求分析............................................3 4 系统设计.....................................................3 4.1 总体设计................................................3 4.2 ATM柜员机界面设计......................................4 4.3 各功能模块设计..........................................5 4.3.1 登陆页面模块设计................................5 4.3.2 选择服务模块设计................................6 4.3.3 取款模块设计....................................7 4.3.4 修改密码模块设计................................8 4.3.5 查询余额模块设计................................9 4.3.6 退卡模块设计....................................9 4.4 异常处理情况说明.......................................10 5 系统实现与测试..............................................10 6 课程设计总结................................................13 6.1 遇到的问题及解决办法...................................13 6.2 心得体会...............................................14 参考文献......................................................14 附录(源码)..................................................14 1课程设计研究背景及意义 这次课程设计是通过JAVA编程来实现ATM柜员机的功能。以前,人们用手算取钱,不管从方便的角度还是速度的角度来看都不及现在。电子技术的不断发展使得ATM自动化的功能不断完善。在二十一世纪的今天,ATM柜员机是人们生活中重要的工具,所以,对ATM柜员机的研究的课程设计具有重大意义。 这次课程设计的主要目的是结合面向对象程序设计课程,培养我们面向对象开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。这次课程设计的主要内容是独立用JAVA语言开发一个小的应用程序。课程设计题目描述和基本功能设计要求 本次设计的ATM柜员机主要是由各个Windows窗口组成,它是由登录页面、选择服务、取款、查询余额、修改密码和退卡等功能。它的各种按钮的事件和功能可以简单的模拟ATM柜员机的要求。组员分工: 组长(单焱): 负责分配其他组员的任务,构建需求分析,系统实现及异常处理情况,调试程序等,把握ATM柜员机的整体布局。 组员1(刘星):负责登陆界面模块,选择服务模块及退卡模块,编写相应代码。组员2(王玲玲):负责取款、修改密码、查询余额模块,编写相应代码。系统需求分析 3.1 功能需求分析 本ATM柜员机的主要功能如下所述: 要求使用图形用户界面。当输入给定的卡号和密码(初始卡号为000000和密码为123456)时,系统能登录ATM柜员机系统,用户可以按照以下规则进行: 查询余额:初始余额为50000元 ATM取款:每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。 ATM存款:不能出现负存款。 修改密码:只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。 3.2 其他需求分析 (1)性能描述 实时性好、灵活性强、易于不同年龄阶段的人操作。(2)设计约束 开发工具:Eclipse3.2.运行环境:Windows 2000以上。(3)界面要求 以Windows窗口形式显示,标题栏为ATM柜员机名称,右上角有最小化按钮、最大化按钮、关闭按钮,不同的窗口中有不同的按钮和选择菜单。系统设计 4.1 总体设计 本次设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。如图: 图1 ATM功能结构示意图 4.2 ATM柜员机界面设计 一个系统的界面应该要简单明了,当然样式美观就更好了。本次设计的界面主要是由窗体组成,操作简单。而每一个窗口则执行相应的功能。 一个系统界面的好坏直接影响到用户的操作,界面设计要求样式美观、简单明了、方便易操作。界面主要分为窗体、菜单、按钮和文本输入框几个部分,分别执行相应的操作。 (1)窗体的设计 窗体整个框架使用Frame类构造,Frame有自己的外边框和自己的标题,创建Frame时可以指定其窗口标题,我创建的窗口标题是各个不同功能的模块的名字,比如说查询余额,还有取款等。相应源代码为:WindowBox(String s){super(s);}、Selection(String s,Account act){ } 向Frame窗口中添加组件使用add()。例如:button1 = new Button(“存款”); p1.add(button1);this.add(p1);super(s);每个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(); JOptionPane.showMessageDialog(null, “您输入的卡号或密码不正确,请核实后再确定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); new WindowBox(“登录界面”); } } /*退卡*/ if(e.getSource()==button2){ dispose(); JOptionPane.showMessageDialog(null, “谢谢使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } } 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);setBounds(300,300,300,300);setVisible(true);validate();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button2){//取款 dispose(); GetBalance gb = new GetBalance(“取款”,act);} if(e.getSource()==button3){//查询余额 Query q =new Query(“查询余额”,act); dispose();} else if(e.getSource()==button4){//退出 dispose(); } JOptionPane.showMessageDialog(null, “谢谢使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } else if(e.getSource()==button5){//修改密码 ChangePassword cp = new ChangePassword(“修改密码”,act); dispose();} 4.3.3 取款模块设计 在取款模块中,和其他的界面也是同样的结构。也是有一个文本框和一个按钮还有标签组成的。用户在文本框中输入他想取的数额,但是必须是100的倍数,而且每一次最多只能取5000块。当然了取款的时候也不能超过卡里的余额,再就是卡里的余额不可以为负,否则就会弹出报错的窗口。其方法为: if(e.getSource()== button){ if(act.get_Money()< 0){// 判断余额是否为负 dispose();JOptionPane.showMessageDialog(null, “余额为负数”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取钱的数额不大于余额 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“选择服务”, act);} if((money % 100!= 0)||(money >= 5000)){// 取钱数为100的倍数或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的钱!“, ”消息“,务窗口 } ”每次只能取100的倍数,而且不能超过5000,请重新输入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“选择服务”, act);// 返回选择服} else if(money > act.get_Money()){// 判断取款数额是否大于余额 dispose(); JOptionPane.showMessageDialog(null, “超过已有的钱数,请重新输入你想取的钱!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } Selection s = new Selection(“选择服务”, 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 查询余额模块设计 在查询余额模块设计中, 和其他的界面的结构相差不多。有一个余额显示和一个按钮还有标签组成的。查询时用到的方法: Query(String s, Account act){// 构造函数 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()));// 查询余额的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(300, 300, 300, 300);setVisible(true); 方法 } 4.3.6 退卡模块设计 在退卡模块设计中,这个方法就更加的简单了,它只是用了if(e.getSource()==button4){//退出 dispose();JOptionPane.showMessageDialog(null, “谢谢使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} 这个方法就可以实现了,这里就不再多说了。 4.4 异常处理情况说明 (1)打开、保存文件时的异常处理 需要处理的异常:IOException(2)数据库访问时的异常处理 需要处理的异常:SQLException(3)加载类时的异常处理 需要处理的异常:ClassNotFindException,当应用程序试图使用Class类中的forName方法通过字符串名加载类时,但是没有找到具有指定名称的类的定义。 (4)加载URL时的异常 需要处理的异常:MalformedURLException,抛出这一异常指示出现了错误的 URL。或者在规范字符串中找不到任何合法协议,或者无法分析字符串。系统实现与测试 (1)编译运行程序后,将会看到如下的界面,如图2所示。如果输入的密码或卡号不正确的话就会报右下图的错误。 图2 主界面—登陆页面 (2)选择服务界面效果 当输入的密码和卡号正确,单击确定后就会进入到选择服务的界面,如图3所示。然后就可以选择所需要的服务了。 图3 选择服务界面 (3)取款界面,如图4所示。 图4 取款界面 当输入的钱数不是100的倍数或每一次大于5000时就会报图5的错误。 图5 输入错误1 当取款时如果超过卡里的余额的话就会报图6的错误。 图6 输入错误2(4)查询余额界面,如图7所示。 图7 查询余额界面 (5)修改密码界面,如图8所示。 图8 修改密码界面 当输入的初始密码不正确会报图9所示错误。 图9 输入错误1 当2次输入的新密码不同会报图10所示错误。 图10 输入错误2 经过测试,所有的功能基本上都实现了,而且运行正常。课程设计总结 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.*; public 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(300,300,220,220);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(); JOptionPane.showMessageDialog(null, “您输入的卡号或密码不正确,请核实后再确定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); // 报输入密码或卡号不正确 new WindowBox(“登录界面”); } } if(e.getSource()== button2){ System.exit(0); dispose();// 退出 } } } /*************主函数****************/ public class ATM { public static void main(String[] args){ new WindowBox(“登录页面”);} } /********* 选择服务窗口 ***************/ import java.awt.*;import java.awt.event.*; public 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(300, 300, 300, 300);setVisible(true);validate(); } } public void actionPerformed(ActionEvent e){ } if(e.getSource()== button2){// 取款 dispose();GetBalance gb = new GetBalance(“取款”, act);} if(e.getSource()== button3){// 查询余额 Query q = new Query(“查询余额”, act);dispose();} else if(e.getSource()== button4){// 退出 dispose(); JOptionPane.showMessageDialog(null, “谢谢使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} else if(e.getSource()== button5){// 修改密码 ChangePassword cp = new ChangePassword(“修改密码”, act);dispose();} /**********取款功能************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public 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(300, 300, 300, 300);this.setVisible(true);} public void actionPerformed(ActionEvent e){ // System.out.println(e.getActionCommand()); double money;money = Double.parseDouble(tf.getText().trim());if(e.getSource()== button){ if(act.get_Money()< 0){// 判断余额是否为负 dispose();JOptionPane.showMessageDialog(null, “余额为负数”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取钱的数额不大于余额 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“选择服务”, act);} if((money % 100!= 0)||(money >= 5000)){// 取钱数为100的倍数或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的钱!“, ”消息“,务窗口 ”每次只能取100的倍数,而且不能超过5000,请重新输入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“选择服务”, act);// 返回选择服 // dispose();} } else if(money > act.get_Money()){// 判断取款数额是否大于余额 dispose();JOptionPane.showMessageDialog(null, “超过已有的钱数,请重新输入 你想取的钱!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false);口 Selection s = new Selection(“选择服务”, act);// 返回选择服务窗 } } } } /********修改密码功能*************/ import java.awt.Button;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Label;import java.awt.Panel;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JOptionPane; 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;Button button;Account act;ChangePassword(String s, Account act){ super(s); this.act = act; tf4 = new TextField(6); tf5 = new TextField(6); tf6 = new TextField(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(300, 300, 300, 300);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; pwd2 = tf4.getText(); pwd3 = tf5.getText(); pwd4 = tf6.getText(); if(pwd2.equals(act.get_Password())){// 判断旧密码是否正确 if(pwd3.equals(pwd4)){// 判断两次输入的新密码是个匹配 act.setPassword(pwd3);// 启用新的密码 dispose(); JOptionPane.showMessageDialog(null, “密码修改成功!”, “消息 JOptionPane.INFORMATION_MESSAGE); ”,Selection s = new Selection(“选择”, act);// 返回服务窗口 } else { this.setVisible(true); // ErrorWarn2 ew = new ErrorWarn2(“消息”,act);dispose();JOptionPane.showMessageDialog(null, “两次密码输入不匹配”, “ JOptionPane.INFORMATION_MESSAGE); 消息”,Selection s = new Selection(“选择”, act);// 返回服务窗口 } } else { this.setVisible(false);dispose(); “,} JOptionPane.showMessageDialog(null, ”初始密码输入错误“, ”消息 JOptionPane.INFORMATION_MESSAGE); Selection s = new Selection(“选择”, act);// 返回选择服务窗口 } } } /**************查询余额功能******************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public class Query extends Frame implements ActionListener { Button button;Account act; Query(String s, Account act){// 构造函数 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(300, 300, 300, 300); setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()== button){ dispose(); Selection s = new Selection(“选择服务”, act);// 返回选择服务窗口 } } } /***********账户****************/ import java.io.*;/* 该类为实现客户信息及部分功能 */ public 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模拟程序 姓名: 学号:2009118246 学院:信息科学与技术学院 专业:计算机科学与技术 一、课程设计目的和内容 目的:课程设计的主要目的是结合面向对象程序设计课程,培养面向对象软件开发的思维,初步了解软件开发的一般流程,提高用JAVA编程的实际动手能力并增强大家对面向对象的了解。 内容:设计ATM取款机主要包括登录页面、选择服务、存款、取款、查询余额、修改密码和退出等功能。注:各种按钮的事件和功能简单模拟ATM取款机的要求。 二、系统需求分析 1、功能需求分析(1)模拟ATM柜员机程序; (2)修改密码。当用户需要修改密码时,可以用这个功能,新密码长度不小于6位,不允许出现6位完全相同的情况,只有旧密码正确,新密码符合要求,且两次输入相同的情况下才可以成功修改密码。(3)取款。用户根据自己需要取多少钱,输入要取的金额,每次取款金额为100的倍数,总额不超过5000元,支取金额不允许透支。(4)查询余额。用户需要知道自己帐户还剩多少钱时,可以查询自己帐户的余额。 (5)存款。用户可以存款,金额为100的倍数,不能出现负存款。(6)锁机。当用户3次输入密码错误时,停止操作。 2、设计需求分析 A界面设计简洁、友好、美观大方。B操作简单、快捷方便。 C信息分类清晰、准确。3.ATM功能模块图 4、约束条件(1)设计工具 开发工具:NetBeans 运行环境:Windows 7(2)界面要求 以Windows窗口形式显示,标题栏为ATM自动取款机不同的窗口中有不同的按钮和选择菜单。 三、系统设计 1、功能结构模块图 我们所设计的ATM柜员机主要是由登录页面模块还由选择服务模块组成,其中选择服务模块又由取款模块、查询余额模块、修改密码模块、退卡模块组成。其功能结构图如下所示: 2、业务流程图 四、详细设计 1、界面设计概述 我设计的ATM机,主要应用java图形用户界面开发的知识,在netbeans上根据要求来创建窗体,窗体整个框架使用JFrame类构造,JFrame有自己的外边框和自己的标题,创建JFrame时可以指定其窗口标题,在创建窗口时,好多代码是自动生成,我只是在其基础上添加一些约束条件的代码,比如说每次输入的取款金额必须为100的整数,当密码输入三次错误,便锁卡等代码需要自己编写,这里我会主要说明自己编写的那部分代码,也是程序中比较重要的部分,其中有许多Swing组件重复应用,代码相同,在报告中不重复说明,比如说数字“0-9”的代码,“退卡”按钮的代码等。 1、各模块界面设计与程序设计 主模块设计: 主函数中定义了6个静态变量:密码(thePassword),余额(balance),新密码1(password1),新密码2(password2),其中密码为String类型,余额是double型,计数器(counter),用来记密码的输入次数,整型,初始化为0,dataStr是String类型,初始化为空字符串,还定义了FileWriter()和FileReader()方法分别用来写和读ATM在交易中的余额和密码也就是dataStr,使用户的余额和密码变成变化后的值。在主方法中首先要调用一次FileReader()方法,获取余额和密码。程序代码如下: import java.io.*;public class Atm { /** * @param args the command line arguments */ static String thePassword; static double balance; static int counter = 0; static String password1; static String password2; static String filePath = “./temp.txt”; static File file = new File(filePath);static String dataStr = “";//写文件 static void FileWriter(){ String dataStr; try{ if(!file.exists()) file.createNewFile(); dataStr = balance + ”,“ + thePassword + ”,“; byte[] data = dataStr.getBytes(); FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.close(); } catch(Exception e){ e.printStackTrace(); } } //读文件 static void FileReader(){ try{ if(!file.exists()) file.createNewFile(); byte[] data = new byte[64]; FileInputStream fis = new FileInputStream(file); int rs = 0; while((rs = fis.read(data))> 0){ dataStr += new String(data,0,rs); } if(!dataStr.isEmpty()){ String[] sets = dataStr.split(”,“); balance = Double.parseDouble(sets[0]); thePassword = sets[1]; } fis.close(); } catch(Exception e){ e.printStackTrace(); } } public static void main(String args[]){ FileReader();//调用读文件 try { for(javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()){ if(”Nimbus“.equals(info.getName())){ javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch(ClassNotFoundException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(InstantiationException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(IllegalAccessException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch(javax.swing.UnsupportedLookAndFeelException ex){ java.util.logging.Logger.getLogger(AtmWelcome.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } AtmWelcome aw=new AtmWelcome();aw.setSize(390,290); aw.setVisible(true); } } 1)待机界面 这个界面可以说是一个待机界面,点击“插卡”按钮,进入登陆界面,其过程相当于ATM读取磁卡信息的过程,利用了Swing控件中的标签和按钮,在“插卡”按钮添加鼠标点击事件代码如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnter().setVisible(true);//进入登陆界面 this.setVisible(false);} 2)登陆界面 这个登陆界面,用户名和账号在插卡时相当于系统已经读取,所以下面这个界面只是密码验证,输入正确的密码,若正确,则进入主交易界面,若错误则进入密码错误,重新输入,若输入3次错误,则进入锁卡界面,具体界面和程序代码如下所示: “确定”按钮的鼠标点击事件代码(用户三次输入错误判断程序): private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: int l=jPasswordField1.getText().length(); if(l==6&&jPasswordField1.getText().equals(Atm.thePassword)) { new AtmEnterSuccess().setVisible(true); this.setVisible(false);} else if(Atm.counter<2) {new AtmPasswordError().setVisible(true); this.setVisible(false); Atm.counter++; } else{new AtmLock().setVisible(true); this.setVisible(false); } } “数字0-9”按钮的鼠标点击事件代码: public void setNumber(String c){ jPasswordField1.setText(jPasswordField1.getText()+c); } private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”1“); } private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”2“);} private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”3“);} private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”4“);} private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”5“);} private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”6“);} private void jButton7MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”7“);} private void jButton8MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”8“);} private void jButton9MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”9“);} private void jButton12MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: setNumber(”0“);} “退卡”按钮的鼠标点击事件代码: private void jButton10MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWelcome().setVisible(true);//返回到待机界面 this.setVisible(false);} “更正”按钮的鼠标点击事件代码: private void jButton14MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: int l = jPasswordField1.getText().length(); if(l!= 0) jPasswordField1.setText(jPasswordField1.getText().substring(0,l-1));} 3)主交易界面 这个界面分别设计了“查询余额”按钮,“取款”按钮,“修改密码”按钮等,点击时分别进入相应的功能界面,具体代码如下所示:“查询余额”按钮的鼠标点击事件代码: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmAccountBalance().setVisible(true);//进入显示余额界面 this.setVisible(false);} “取款”按钮的鼠标点击事件代码: private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWithdrawl().setVisible(true);//进入取款界面 this.setVisible(false);} “存款”的鼠标点击事件代码: private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDeposit().setVisible(true);//进入存款界面 this.setVisible(false);} “修改密码”的鼠标点击事件代码: private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmPasswordChange().setVisible(true);//进入密码修改界面 this.setVisible(false);} 4)密码错误界面 当在登录界面登陆时,若密码错误则出现密码错误界面,这个界面上点击“继续” 按钮则返回到登陆界面重新输入密码,具体代码如下: “继续”按钮的鼠标点击事件代码: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnter().setVisible(true);//返回到登陆界面 this.setVisible(false);} 5)锁卡界面 密码输错3次,卡锁,代码见登陆界面的“确定”按钮点击事件代码。6)余额查询界面 点击“继续”则返回到主交易界面,具体的代码如下: 显示余额的代码: public AtmAccountBalance(){ initComponents(); java.awt.EventQueue.invokeLater(new Runnable(){ public void run(){ setVisible(true); } }); jLabel1.setText(”当前余额:“+ Atm.balance); Atm.FileWriter();} “继续”按钮的鼠标点击代码如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//进入主交易界面 this.setVisible(false);} 7)取款界面 取款界面规定单次最多取款5000元,若所取金额在界面上有,则直接点击相应按钮,若没有,则点击“其他面额”按钮,然后输入自己想取得面额,具体事件代码如下: 100,300,500,1000,2000按钮的鼠标点击事件代码如下: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton1.getText())) { new AtmWithdrawlSuccess().setVisible(true);//进入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton1.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//进入余额不足界面 this.setVisible(false); } } private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton3.getText())) { new AtmWithdrawlSuccess().setVisible(true);//进入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton3.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//进入余额不足界面 this.setVisible(false); } } private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here if(Atm.balance>=Double.valueOf(jButton5.getText())) { new AtmWithdrawlSuccess().setVisible(true);//进入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton5.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//进入余额不足界面 this.setVisible(false); } } private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton4.getText())) { new AtmWithdrawlSuccess().setVisible(true);//进入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton4.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//进入余额不足界面 this.setVisible(false); } } private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(Atm.balance>=Double.valueOf(jButton6.getText())) { new AtmWithdrawlSuccess().setVisible(true);//进入取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jButton6.getText()); Atm.FileWriter();} else{ new AtmBalanceNotEnough().setVisible(true);//进入余额不足界面 this.setVisible(false); } } “其他面额”按钮鼠标点击事件代码: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmWithdrawlInput().setVisible(true);//输入取款金额界面 this.setVisible(false);} “返回”按钮的鼠标点击事件代码: private void jButton7MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//返回主交易界面 this.setVisible(false);} 8)取款金额输入界面 这个界面是当用户所想取得金额在界面上没有的时候,便需要用户自己输入,规定输入的金额必须是100的倍数,且不大于5000元,具体事件代码如下所示:(其中按钮0-9的代码,“退卡”按钮等的代码和前面相同) “确定”按钮的鼠标事件代码: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: double a=Double.valueOf(jTextField1.getText()); if(Atm.balance>=a&&a%100==0&&a<=5000.0){ new AtmWithdrawlSuccess().setVisible(true);//取款成功界面 this.setVisible(false); Atm.balance=Atm.balance-Double.valueOf(jTextFiled1.getText()); Atm.FileWriter(); } if(a%100!=0||a>5000){ new AtmWithdrawlInputError().setVisible(true);//取款金额输入错误界面 this.setVisible(false); } else{ new AtmBalanceNotEnough().setVisible(true);//余额不足 this.setVisible(false); } } “取消”按钮的鼠标事件代码: private void jButton13MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true);//返回到主交易界面 this.setVisible(false);} 9)存款界面 和取款界面类似,具体的代码如下所示: 100,300,500,1000,2000按钮的鼠标事件代码: private void jButton1MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true);//存款成功界面 this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton1.getText()); Atm.FileWriter();} private void jButton3MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton3.getText()); Atm.FileWriter();} private void jButton5MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton5.getText()); Atm.FileWriter();} private void jButton4MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton4.getText()); Atm.FileWriter();} private void jButton6MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(jButton6.getText()); Atm.FileWriter();} “其他面额”按钮的鼠标事件代码: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmDepositInput().setVisible(true);//输入存款金额界面 this.setVisible(false);} 10)输入存款金额界面 和存款界面2类似,具体的事件代码如下: “确定”按钮的鼠标事件点击代码: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String cs=jTextField1.getText(); if(Double.valueOf(cs)%100==0&&Double.valueOf(cs)>0){ new AtmDepositSuccess().setVisible(true); this.setVisible(false); Atm.balance=Atm.balance+Double.valueOf(cs); Atm.FileWriter();} else{new AtmDepositInputError().setVisible(true);//存款金额输入错误界面 this.setVisible(false); } } 11)密码修改界面 本来修改密码是要输入原密码的,但我们在使用ATM时,一开始就输入了密码,否则也不能进入修改密码界面,所以在这里直接输入新密码,连续两次输入,且两次输入的密码相同,且6位密码不完全相同,则修改密码成功,否则失败,具体代码如下: “确定”按钮的鼠标事件代码: private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String a=jPasswordField1.getText(); Atm.password1=a; new AtmPasswordInAgain().setVisible(true);//进入密码确认界面 this.setVisible(false);} “返回”按钮的鼠标事件代码: private void jButton10MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmEnterSuccess().setVisible(true); this.setVisible(false);} 12)密码修改确认界面 第二次输入新密码,具体代码如下: “确定”按钮的鼠标事件代码: private boolean Samechars(String str)//若6位密码相同,则返回false { if(str.equals(”000000“)==true || str.equals(”111111“)==true || str.equals(”222222“)==true || str.equals(”333333“)==true || str.equals(”444444“)==true || str.equals(”555555“)==true || str.equals(”666666“)==true || str.equals(”777777“)==true || str.equals(”888888“)==true || str.equals(”999999")==true) return true; else return false;} private void jButton11MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: String b= jPasswordField1.getText(); Atm.password2=b; int i = jPasswordField1.getText().length(); if(i== 6 && Atm.password1.equals(b)&& Samechars(b)==false) { Atm.thePassword = b; Atm.FileWriter(); new AtmPasswordChangeSuccess().setVisible(true);//进入修改成功界面 this.setVisible(false); } else { new AtmPasswordUnsucc().setVisible(true);//进入失败界面 this.setVisible(false);} } 13)密码修改成功界面 当两次输入的密码相同,则弹出密码修改成功界面,点击“继续”按钮返回到主交易界面,退出系统则点击“退卡”按钮。代码略。14)密码修改失败界面 点击“确定”按钮,则返回到修改密码界面,若放弃修改点击“退卡”按钮,若还想进行其他交易,则点击“确定”后,再点击修改密码界面的“返回”按钮。 “确定”按钮的鼠标点击事件代码: private void jButton2MouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: new AtmPasswordChange().setVisible(true);//返回到密码修改界面 this.setVisible(false);} 15)存款成功界面 点击“继续”则返回到主交易界面,“退出”则退出交易。16)存款失败界面 当所存金额不是100的整数时,则存款失败,同样点击“返回”按钮则返回到主交易界面,点击“退卡”则退出交易。17)取款成功界面 当索取金额不大于5000,且是100的整数,当前余额不小于索取金额时,则取款成功。 18)取款失败界面(余额不足) 当输入的金额大于当前余额,输入的金额不大于5000且是100的倍数,则弹出余额不足界面。19)取款失败界面(输入金额错误) 当输入的金额不是100的倍数且大于5000时,出现此界面。 五、参考文献 《Java应用案例教程》张红梅,姜晓刚等著 清华大学出版社 六、心得体会 在这次的期中课程设计中,我主要运用了Java语言的图形用户界面设计、异常处理、Swing控件,输入输出流等,综合运用了Java语言。我深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,在完成设计的同时培养了自己的编程思维,为以后做别的设计打下基础。 刚开始做ATM机课程设计的时候,我简直一点头绪也没有,我想着自己编程一直都那么差,怎么可能完成这么难的设计,但是这是期中考试设计,肯定得交啊,所以我不得不图书馆借书看,边看边做,在做的过程中,我才知道java不只是写代码,还有许多其他的功能,我发现我对专业课不像以前那么的排斥了,还有感觉通过自己查询相关书籍去实践以及和同学交流获取的知识更巩固,我不再那么讨厌编程了,我觉得无论什么事情,只要自己愿意去尝试,并且尽自己最大努力去做,总会有所收获的。本来一直认为这门专业对女生来说学起来很吃力,很困难,但是现在又有了信心,差的人可以付出更多的努 力去弥补自己的不足,这样就可以不被落下了。在以后的学习中,我会更加努力,我觉得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");} } 湖南科技大学计算机科学与工程学院 数据库课程设计报告 题目:人事管理管理系统 学 号:1005030221 姓 名:艾向兵 指导教师:张黎 完成时间:2012年1月4日 组员:苏勇,成佳裕,艾向兵 企业人事管理系统主要用于员工个人资料的录入,职务变动的记录和管理。使用人事管理系统,便于公司领导掌握人员的动向,及时调整人才的分配 1.1系统功能需求分析 人事管理系统主要有以下几项功能要求:.新员工资料的输入。 .自动分配员工编号,并且设置初始的用户密码:.人事变动的记载,包括岗位和部门的调整。.员工信息的查询和修改,包括员工个人信息和密码 1.2 系统功能模块设计 根据系统功能要求,可以将系统分解成几个模块来分别设计应用程序界面,如图,人事资源管理 包括:新员工档案输入,人事变更,员工档案查询 1.3 与其它系统的关系 本关系是公司管理信息系统的基础部分,为其他子系统,如考勤管理系统,工资管理系统和员工培训系统,提供员工的基本信息。同时为其他系统提供了员工登录的密码认证和权限分配。1.4数据库设计 数据库需求分析: 员工信息:员工号,密码,权限,姓名,性别,生日,专业,通讯地址,电话,Email,当前状态,其他。 人事变动:记录号,员工,变动,详细描述 部门设置:部门编号,名称 员工变动代号表 员工信息表 员工职位代码表 管理员登陆界面 信息查询,修改,删除主界面 查询单个员工的界面 总 结 这次的课程设计,是在学习了Java以后通过阅读课本及在图书馆借阅相关书籍同严景、孟珍三人共同完成的。在开发这个系统的过程中,碰到很多或大或小的问题,我们一起思考,一起努力,最后大部分都解决了,得到了现在的这个简单的人事管理系统。 在编制过程中,我们首先考虑到了界面的友好性,并在界面设计时不采用烦琐的细节,使界面简单、清晰,便于操作。一开始我们是想做个登录界面,实现用户的登录权限管理,但试了几次都没有达到预期的效果,最后不得不放弃。 通过这次课程设计,我知道了什么事情都不那么简单,只有努力去做了,你才会有收获,不管收获大小,付出的过程总是有的。有些事情只有亲身感受,你才知道它的价值有多大。同时在遇到困难的时候要沉着冷静,首先要冷静分析问题,对于很难解决的问题要学会请教他人,还可以与别人合作。 在这次数据库系统课程设计中,我主要进行的是界面的设计,以及进行进行整合操作,界面是我学习Java以来第一次做,以前不怎么用的JTabel等,现在都已经熟练的应用了,特别是这次的弹出窗口,我在做这个的时候可谓是一窍不通,因为把按钮JButton定义为了局部变量而在时间响应中而得不到另一个窗口的弹出。 还有就是在整个过程中的ID传递让我不知怎么办,一个简单的参数传递才得以搞定,基础知识还是不够牢靠。在得到修改表的数据库内容后未把值传给表格。 虽然这次课程设计付出了大量的时间,但是我知道我得到的收获远远不是这些时间可以衡量的,它将给我今后的学习和工作带来更多的收益。通过对此课题的开发,使我对用Java开发系统有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如没有设置登录界面,没有考虑到异常等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。 弹出登录程序的界面程序 public void actionPerformed(ActionEvent e){ if(e.getSource()==okButton){ String userID=text.getText();String passWD=String.valueOf(passwd.getPassword());if(userID.equals(“1”)&&passWD.equals(“1”)){ JOptionPane.showMessageDialog(null, “登陆成功!”, “消息”, JOptionPane.INFORMATION_MESSAGE); new UserWindow2().userWindow2();//弹出第二个窗体 } else{ JOptionPane.showMessageDialog(null, “对不起您的用户名或密码错误!”, “错误”,JOptionPane.ERROR_MESSAGE); text.setText(“");passwd.setText(”“);} } if(e.getSource()==deleButton){ text.setText(”“);passwd.setText(”“);} } 进行信息查询,修改,删除的程序响应代码: public void actionPerformed(ActionEvent e){ if(e.getSource()==button1){ new UserWindow3(); } if(e.getSource()==button2){ UserWindow7 u= new UserWindow7();u.userWindow7();} if(e.getSource()==button3){ UserWindow5 u=new UserWindow5(); u.userWindow5();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button){ int id= Integer.parseInt(text0.getText());//得到用户编号 String name=text1.getText();//得到用户姓名 String sex=text2.getText();//得到性别 String birthDay=text3.getText();//得到生日 String department=text4.getText();//得到所在部门 String job =text5.getText();//得到职位 String education=text6.getText();//得到教育程度 String spcialty=text7.getText();//专业技能 String address=text8.getText();//得到地址 String tel=text9.getText();//得到电话 String email=text10.getText();//得到电子邮箱 String state=text11.getText();//得到员工状态 String remark=text12.getText();//得到备注 Insert in=new Insert();// boolean b; b=in.insert(id,name,sex,birthDay,department,job,education,spcialty,address,tel,email,state,remark);if(b){ JOptionPane.showMessageDialog(null, ”数据保存成功!“, ”消息“, JOptionPane.INFORMATION_MESSAGE);} } } public void actionPerformed(ActionEvent e){ // TODO Auto-generated method stub id = Integer.parseInt(text.getText()); if(e.getSource()==button){ UserWindow8 us = new UserWindow8();us.userWindow8(id); } Container container=this.getContentPane();container.setLayout(new BorderLayout()); JPanel pan =new JPanel();JLabel lab = new JLabel(”请输入工号:“);JTextField text=new JTextField(10);JButton button =new JButton(”查询“);JButton button1=new JButton(”删除“);pan.add(lab);pan.add(text);pan.add(button);pan.add(button1);container.add(pan); String []titles={”员工编号“,”姓名“,”性别“,”生日“,”部门“,”职务“,”教育程度“,”专业技能“,”家庭住址“,”联系电话“,”电子邮箱"}; String [][]userInfo={}; JTable table =new JTable(userInfo,titles);table.isCellEditable(2,2);JScrollPane scrollpane =new JScrollPane(taboooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo......................le); container.add(scrollpane,BorderLayout.SOUTH);第二篇:JAVA课程设计-ATM机模拟系统
第三篇:Java期中课程设计(ATM机)报告
第四篇:ATM取款机java课程设计
第五篇:人事管理系统Java课程设计报告