ATM标准管理系统java窗口界面_第1页
ATM标准管理系统java窗口界面_第2页
ATM标准管理系统java窗口界面_第3页
ATM标准管理系统java窗口界面_第4页
ATM标准管理系统java窗口界面_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ATM标准管理系统java窗口界面

BAM银行账户管理系统(ATM管理系统)

本系统采用JAVA语言并在eclipse环境下编

写测试完成,涉及类的概念,以及面向对象的几

大特性(继承,封装,多态,抽象),也有异常

处理机制,采用集合(更好)存储账户数据,基

本可以满足大多数BAM系统的相关实现,且代码

内标注大量注释,读者可以很轻松地理解相关逻

辑,大家可以开心参考。

系统简介:

特点:采用窗口界面风格,而不是传统的命令行、控制台运作模式

1、JAVA类的面相对象的应用,拥有异常处理

机制,不会因为输入错误而导致程序崩溃

2、主要有7个类,即①Account(账户类)

②SaveAccount(储蓄

账户类):不能透支

③CreditAccount(信

用账户类):可以透支

©Bank(银行类)

ATMOpenAccountFrame

(开户窗口页面)

@ATMLoginFrame(登

录窗口页面)

⑦ATMMainFrame(操

作窗口页面)

带有完善的相关信息提示弹出窗口见

F面截图

类的具体属性级行为见代码

3、各个类之间的相互关系,涉及继承、封

装、多态、抽象,在多态中又涉及重载和重

写,请读者注意相关联系(关注注释)

4、可以实现数据保存功能,数据将保存在

文件中(即当你注册了一个账户,下次再登

陆系统时,可以实现与上次最后的操作

相衔接)

5、账户号自动生成,比较符合现实

6、主要功能有:1.开户

2.查询账户余额

3.存款

4.取款

5.转账(一个账户到另一个账

户)等……

7、运行时界面简示

1.初始界面(账户登录)

2.账户登录后界面

3.相关信息提示一览(只列举一部分)

1、查询:2、存款:

目盘作界囱

3、取款:

国掾作界面

破户姓名:旅司望余额:570.0

4、转账:

账户姓名:张可望余额:550.0

4、用户开户界面:

注意事项:

1、本系统采用的编程环境是JDK1.7,jer7。

所以,运行代码需要保持电脑上所装的JDK为

1.7以上版本,如有报错,只需换个高一点的版

本即可。注意:第一次装JDK,要配置环境变量

(请查阅相关资料,比较简单)

2、本系统代码涉及到包,所以如果报名不一

致就会报错,解决方法:修改一下包名即可

3、建议把各个类写在同一个包下面,且每一

个类单独写一个java文件,如下图:

3Java-BAM07/src/com/qx/ATMMainFrame.java-EclipseSDK

FileEditSourceRefactorNavigateSearchProjectRunWindowHelp

「二、势▼Q▼q▼:咨审6▼一甲CD闿回管"i▼j▼0s

-«PackageExplorer京、厂B由A1MLoginFrame.java“AlMMainFrame.javaAlMUoenAc(

D82jblName=newJLat

BAM▲83jblMsg.setText(,

BAM0284)

BAM0385)

BAM0486

BAM0587);

BAM06

88//给取款按钮注册监听器

:JBAM07

89jbWithdraw.addActionListenei

90s

田com.qxnewActionListener(){

UAccount.java191-publicvoidactionPe

,物ATMLoginFrame.java192Strings=JOpti

.ATMMainFrame.java193doublemoney=Dot

ATMOpenAccountFrar

I95bank.withdraw(ac

Bankjava/*JOptionPane.st

|jCreditAccount.java■96JOptic

[j,SavingAccount.javaJ97jblName=newJLat

JRESystemLibrary[jre7]198

3accounttxt

\

4、在运行程序前,需要在项目下面新建一个

account.txt(用来保存数据)文件(如上图),

并在其中写入至少一个账户信息,(如下图,其

中每项代表的意思,请读者参照代码内的注释),

否则在初始化的时候会因为找不到账户信息,从

而产生异常。

OJava-BAM04/account.txt-EdipseSDK

FileEditNavigateSearchProjectRunWindowHelp

匚j玲▼。▼亘ini

上PackageExplorer2accounttxt

张可里,

IS生l|1001r1001,321323,0,510.0

会BAM

©BAM02

BBAM03

审BAM04

0src

出com.qx

J.Accountjava

(jjATM.java

|j(Bankjava

.CreditAccountjava

[£SavingAccountjava

■KJRESystemLibrary[jre7]

[3|account.txt

系统源码:

Account类

packagecom.qx;

importjavax.swing.JOptionPane;

/★★

*账户类:包含两种账户类型一>1.储蓄账户

2.信用账户

*/

publicabstractclassAccount{

//属性

protectedlongid;

protectedStringpassword;

protectedStringname;

protectedStringpersonld;

protectedStringaccountType;

protecteddoublebalance;

//构造方法

publicAccount(){

super();

)

publicAccount(longid,String

password,StringnamerString

personld,

Stringtype,doublebalance){

super();

this.id=id;

this.password=password;

=name;

this.personld=personld;

this.accountType=type;

this.balance=balance;

}

//getXxx,setXxx方法

publiclonggetld(){

returnid;

)

publicvoidsetld(longid){

this.id=id;

)

publicStringgetPassword(){

returnpassword;

)

publicvoidsetPassword(String

password){

this.password=password;

}

publicStringgetName(){

returnname;

)

publicvoidsetName(Stringname){

this.namename;

)

publicStringgetPersonld(){

returnpersonld;

}

publicvoidsetPersonld(String

personld){

this.personld=personld;

)

publicStringgetAccountType(){

returnaccountType;

}

publicvoidsetAccountType(String

accountType){

this.accountType=accountType;

)

publicdoublegetBalance(){

returnbalance;

}

publicvoidsetBalance(double

balance){

this.balance=balance;

)

★★

*存款

*/

publicvoiddeposit(doublemoney){

balance+=money;

)

/*★

*取款(取款方式由账户类型决定,所以设

为抽象方法,相应的Account类应设为抽象类)

*/

publicabstractvoid

withdraw(doublemoney);

}

SavingAccount类

packagecom.qx;

importjavax.swing.JOptionPane;

★★

*储蓄账户类

*/

publicclassSavingAccountextends

Account{

//构造函数

publicSavingAccount(){

super();

)

publicSavingAccount(longid,

Stringpassword,Stringnamer

Stringpersonld,String

accountTypeAdoublebalance){

super(idApassword,name,

personld,accountType,balance);

}

〃对父类的withdraw()实现

publicvoidwithdraw(double

money){

if(balance<money){

/*System.out.printin("对不起,

账户余额不足!”);*/

JOptionPane.showMessageDialog(nu

11,”对不起,账户余额不足!”,

"信息提示

”,JOptionPane.ERROI^MESSAGE);

}

else

balance-=money;

}

}

}

CresitAccount类

packagecom.qx;

importjavax.swing.JOptionPane;

/★★

*信用账户类,增加一个信用额度ceiling属

*/

publicclassCreditAccountextends

Account{

privateintceiling;

//构造函数

publicCreditAccount(){

super();

)

publicCreditAccount(longid,

Stringpassword,Stringname,

Stringpersonld,String

accountType,doublebalance,int

ceiling){

super(idzpassword,name,

personld,accountType,balance);

this.ceiling=ceiling;

)

//getX*x,setXxx方法

publicintgetCeiling(){

returnceiling;

}

publicvoidsetCeiling(intceiling)

(

this.ceiling=ceiling;

)

〃实现父类的withdraw()

publicvoidwithdraw(double

money){

if((balance+ceiling)<money){

/*System.out.printin("对不起,

已超出您的信用额度!”);*/

JOptionPane.showMessageDialog(nu

11,”对不起,已超出您的信用额度!”,

”信息提示

“,JOptionPane.ERROR_MESSAGE);

)

else

(

balance一=money;

)

)

}

Bank类

packagecom.qx;

importjava.io.BufferedReader;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileNotFoundException;

importjava.io.FileReader;

importjava.io.FileWriter;

importjava.io.lOException;

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Properties;

importjavax.swing.JOptionPane;

/**

*Bank类

*编写Bank类,属性:

1.当前所有的账户对象的集合,存放在数组中

2.当前账户数量

方法:

1.用户开户,需要的参数:id,密码,密码确认,姓

名,身份证号码,账户类型,返回新创建的

Account对象的账号,

提示:用si.equals(s2)可以比较si,s2

两个字符串的值是否相等.账户类型是一个整数,

为0的时候表示储蓄账户,为1的时候表示信用

账户

2.用户登录,参数:id,密码返回登录账户的账

3.用户存款,参数:id,存款数额,返回void

4.用户取款,参数:id,取款数额,返回void

5.查询余额,参数:id,返回该账户的余额

double

用户会通过调用Bank对象以上的方法来操作自

己的账户,请分析各个方法需要的参数

*/

publicclassBank{

/*privateAccount[]accounts=new

Account[20];*/

privateListaccountsList;

privateintnumber;〃账户数目

privateintid=1001;〃确定银行账号从

1001开始生成,即第一个账户的账号是1001

〃构造函数

publicBank(){.

accountsList=new

ArrayList<Account>();

number=0;

BufferedReaderbufReader=null;

Properties

props二System.getProperties();

String

path二props.getProperty(^user.dir");

try{

bufReader=newBufferedReader(new

FileReader(new

File(path,“account,txt")));

Strings=bufReader.readLine();

while(s!=null){

StringE]str=s.split;

if(str[4].equals("0"))

(

AccountsavingAcc=new

SavingAccount(Long.parseLong(str[0]),

str[1].toStringO,

str[2].toStringO,

str[3]・toString(),str[4]・toString(),

Double.parseDouble(str[51));

accountsList.add(savingAcc);

else

{

AccountcreditAcc=new

CreditAccount(Long.parseLong(str[0]),

str[1].toStringO,

str[2].toStringO,

str[3].toString(),str[4].toString(),

Double.parseDouble(str[5]),5000);

accountsList.add(creditAcc);

)

number++;

id++;

s=bufReader.readLine();

)

}catch(NumberFormatExceptione){

//TODOAuto-generatedcatchblock

e.printStackTraceO;

}catch(FileNotFoundExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(lOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}finally{

try{

if(bufReader!=null)

(

bufReader.close0;

)

}catch(lOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

)

)

)

//getXxx,setXxx

publicListgetAccountsO{

returnaccountsList;

)

publicvoidsetAccounts(Listaccounts){

this.accountsList=accounts;

publicintgetNumber(){

returnnumber;

)

publicvoidsetNumber(intnumber){

this,number=number;

}

publicintgetldO{

returnid;

)

publicvoidsetld(intid){

this,id=id;

)

/**

*开户

*/

publicAccountopenAccount(String

passwdl,Stringpasswd2,Stringname,

Stringpersonld,Stringtype){

〃创建一个新账户

Accountaccount=null;

〃判断两次密码是否一致

if(passwdl.equals(passwd2)){

〃若一致,再判断账户类型(根据type

的值)

if(type,equals("1")){

〃可令开始余额为10,信用额度为

5000

account=newCreditAccount(id,

passwdl,name,personld,type,10,5000);

)

else

(

account=newSavingAccount(id,

passwdl,name,personld,type,10);

)

〃将账户存入账户集合accountsList中

accountsList.add(account);

JOptionPane.showMessageDialog(null,

〃开户成功!!!〃,〃信息提示〃,

JOptionPane.INFORMATION_MESSAGE);

JOptionPane.showMessageDialog(null,

"您的卡号为:〃+id+〃\n〃+

〃您的密码为:

"+passwdl+"\n"+"您的户名为:”+name+"\n"+

〃您的身份证号为:

“+personld+"\n"+”您的账户类型为:

〃+type+〃\n〃,〃信息提示〃,

JOptionPane.INFORMATION_MESSAGE);

account.accountType=type;

number++;

id++;

returnaccount;〃此时开户成功

)

else

(

JOptionPane.showMessageDialog(null,

〃对不起!您两次密码输入不匹配,开户失败!!!

〃信息提示

”,JOptionPane.ERROR_MESSAGE);

returnnull;〃此时开户失败

/**

*保存数据

*/

publicvoidsaveAccountDate(){

BufferedWriterbufWriter=null;

try{

Properties

props二System.getProperties0;

String

path=props.getProperty(^user.dir");

Strings=null;

bufWriter=newBufferedWriter(new

FileWriter(new

File(path,“account,txt")));

for(Iteratoriterator=

accountsList.iterator();iterator.hasNext(

);)

{〃若存在账户

Accountacc=(Account)

iterator,next();

〃写入账户信息到account.txt

bufWriter.write(acc.id+",");

bufWriter.write(acc.getPassword()+”,");

bufWriter.write(acc.getName()+^,");

bufWriter.write(acc.getPersonId()+”,");

bufWriter.write(acc.getAccountType()+”,

〃);

bufWriter.write(Double.toString(acc.get

Balance()));

bufWriter.newLine()

)

bufWriter.flush();〃清空缓存中的内

}catch(lOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}finally{

try{

if(bufWriter!=null){

bufWriter.close();

)

}catch(lOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

)

)

)

/**

*登录验证

*/

publicAccountverifyAccount(longid,

Stringpassword){

Accountaccount=null;

Accountacc=null;

for(Iteratoriterator=

accountsList.iterator();

iterator.hasNext();)

{〃若存在账户

acc=(Account)iterator,next();

if(acc!=null){

if(id==acc.getldO&&

password,equals(acc.getPassword())){

account=acc;

break;

)

)

else

(

break;

)

)

returnaccount;

)

/**

*转账验证(方法的重载)

*/

publicAccountverifyAccount(longid){

Accountaccount=null;

Accountacc=null;

for(Iteratoriterator=

accountsList.iterator();

iterator.hasNext();)

(〃若存在账户

acc=(Account)iterator,next();

if(acc!=null){

if(id==acc.getldO){

account=acc;

break;

}

)

else

(

break;

)

)

returnaccount;

)

/**

*转账

*/

publicvoidtransferAccount(Account

account1,Accountaccount2,doublemoney){

account1.withdraw(money);

account2.deposit(money);

)

/**

*存款

*/

publicvoiddeposit(Accountaccount,

doublemoney){

account,deposit(money);

)

/**

*取款

*/

publicvoidwithdraw(Accountaccount,

doublemoney){

account.withdraw(money);

ATMLoginFrame类

packagecom.qx;

importjava.awt.Dimension;

importjava.awt.GridLayout;

importjava.awt.Toolkit;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjavax.swing.JButton;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JOptionPane;

importjavax.swing.JPanel;

importjavax.swing.JTextField;

publicclassATMLoginFrameextendsJFrame{

privateJLabeljblCardNo,jblPasswd;

privateJTextFieldjtfCardNo,jtfPasswd;

privateJButton

jbOk,jbCancel,jbOpenAccount;

privateJPaneljpl,jp2,jp3,jp4;

privateBankbank;

publicATMLoginFrame(){

bank=newBank();

〃实例化所有组件

jblCardNo=newJLabel("用户名:“);

jblPasswd=newJLabel(“密码・")・

jtfCardNo=newJTextField(20);

jtfPasswd=newJTextField(20);

jb0k=newJButton(“确定");

jbCancel=newJButton(〃取消“);

jbOpenAccount=newJButton(“没有账户,

开户〃);

jpl=newJPanel()

jp2=newJPanel();

jp3=newJPanel();

jp4=newJPanel();

jpl.add(jblCardNo);

jpl.add(jtfCardNo);

jp2.add(jblPasswd);

jp2.add(jtfPasswd);

jp3.add(jbOk);

jp3.add(jbCancel);

jp4.add(jbOpenAccount);

〃将每行逐行添加到frame中

this,add(jpl);

this.add(jp2);

this.add(jp3);

this.add(jp4);

this.setLayout(newGridLayout(4,

1));〃取消默认管理器,设置为3行1列的网格

布局

Dimension

d二Toolkit.getDefaultToolkit().getScreenSi

ze();

this.setTitle(〃登陆界面〃);

this.setBounds((d.width-300)/2,

(d.height-200)/2,300,200);

this.setDefaultCloseOperation(JFrame.EX

IT_ON_CLOSE);〃设置关闭窗口时JVM同时推出

this.pack();〃调整窗口至能容纳组件的

最小尺寸

this.setVisible(true);〃设置窗口可见

this.setResizable(false);〃不能最大化

〃使用匿名内部类给2个按钮注册监听器

jbCancel.addActionListener(

newActionListener0{

publicvoid

actionPerformed(ActionEvente){

dispose();〃关闭窗口

)

)

);

jbOk.addActionListener(

newActionListener(){

publicvoid

actionPerformed(ActionEvente){

〃取出用户界面输入的用户名和密

long

cardNo=Integer.parselnt(jtfCardNo.getText

0);

String

passwd=jtfPasswd.getText();

〃调用Bank的相关方法将二者与正

确的做比对

Account

account二bank.verifyAccount(cardNo,

passwd);

if(account!=null)〃假如正确,进

入操作界面

ATMMainFramemainFrame=new

ATMMainFrame(bank,account);〃进入操作界

dispose。;〃关闭登陆界面

}else{〃假如错误,使用对话框提

示错误信息

JOptionPane.showMessageDialog(null,“卡

号或密码错误〃,〃信息提示

”,JOptionPane.ERROR_MESSAGE);

);

jbOpenAccount.addActionListener(

newActionListener0{

publicvoid

actionPerformed(ActionEventargO){

ATMOpenAccountFrame

openFram=newATMOpenAccountFrame();

dispose。;〃关闭登陆界面

)

)

);

).

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

ATMLoginFrameatm=newATMLoginFrame();

ATMMainFrame类

packagecom.qx;

importjava.awt.Dimension;

importjava.awt.FlowLayout;

importjava.awt.GridLayout;

importjava.awt.Toolkit;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.util.Scanner;

importjavax.swing.JButton;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JOptionPane;

importjavax.swing.JPanel;

publicclassATMMainFrameextendsJFrame{

privateAccountaccount;

privateBankbank;

privateJButton

jbDeposit,jbWithdraw,jbCancel,jbQuery,jbT

ransfer;

privateJLabeljblMsg,jblName;

privateJPaneljpl,jp2,jp3,jp4;

/**

*@paramargs

*/

publicATMMainFrame(finalBank

bank,AccounttmpA){

this.account=tmpA;

this.bank=bank;

jbQuery=newJButton("查询”);

jbDeposit=newJButton("存款”);

jbWithdraw=newJButton("取款”);

jbTransfer=newJButton(“转账");

jbCancel=newJButton("退卡");

jblName=newJLabel("账户姓名:

+account.getName());

jblMsg=newJLabel();

jpl=newJPanel();

jp2=newJPanel0;

jp3=newJPanel()

jp4二newJPanel()

jpl.add(jbQuery);

jpl.add(jbDeposit);

jp2.add(jbWithdraw);

jp2.add(jbTransfer);

jp3.add(jbCancel);

jp4.add(jblName);

jp4.add(jblMsg);

〃将每行逐行添加到frame中

this,add(jpl);

this.add(jp2);

this.add(jp3);

this.add(jp4);

this.setLayout(newGridLayout(4,

D);〃取消默认管理器,设置为4行1列的网格

布局

Dimension

d=Toolkit.getDefaultToolkit().getScreenSi

ze();

this.setTitle("操作界〃);

this.setBounds((d.width-300)/2,

(d.height-200)/2,300,200);

this.setDefaultCloseOperation(JFrame.EX

IT_ON_CLOSE);〃设置关闭窗口时JVM同时推出

//this.pack();〃调整窗口至能容纳组件

的最小尺寸

this.setVisible(true);〃设置窗口可见

this.setResizable(false);

〃使用匿名内部类给查询按钮注册监听器

jbQuery.addActionListener(

newActionListener(){

publicvoid

actionPerformed(ActionEvente){

JOptionPane.showMessageDialog(null,“您

账户的当前余额为:"+account.getBalance(),

〃信息提示

〃,JOptionPane.INFORMATION_MESSAGE);

}

)

);

〃给存款按钮注册监听器

jbDeposit.addActionListener(

newActionListener(){

publicvoid

actionPerformed(ActionEventargO){

Strings=

JOptionPane.showInputDialog(“请输入存款金

额:〃);

double

money=Double.parseDouble((s.equals("")?"0

〃:s));

bank,deposit(account,money);

JOptionPane.showMessageDialog(null,“存

款成功!!!〃,〃信息提示〃,

JOptionPane.INFORMATION_MESSAGE);

jblName=newJLabel("账户姓名:

“+account.getName());

jblMsg.setText(,z余额:

“+account.getBalanceO);

)

)

);

〃给取款按钮注册监听器

jbWithdraw.addActionListener(

newActionListener(){

publicvoid

actionPerformed(ActionEventargO){

Strings=

JOptionPane.showInputDialog(”请输入取款金

额:”);

double

money二Double.parseDouble((s.equals("")?〃0

”:s));

bank,withdraw(account,money);

/*JOptionPane.showMessageDialog(nu11,“

取款成功!!!〃,〃信息提示〃,

JOptionPane.INFORMATION_MESSAGE);*/

jblName=newJLabel(“账户姓名:

/z+account.getName());

jblMsg.setText(,z余额:

“+account.getBalanceO);

)

)

);

〃给转账按钮注册监听器

jbTransfer.addActionListener(

newActionListener(){

publicvoid

actionPerformed(ActionEvente){

Stringsld

JOptionPane.showInputDialog(“请输入要转账

的卡号:〃);

longid2=Long.parseLong(sId);

Accountaccount2=

bank.verifyAccount(id2);

if(account2!=null)

(

StringsNum=

JOptionPane.showInputDialog(“请输入您要转

入账户的金额:〃);

double

money=Double.parseDouble((sNum.equals("")

?"0":sNum));

if(money<=account,balance)

(

bank,transferAccount(account,account2,

money);

JOptionPane.showMessageDialog(null,“转

账成功!!!〃,”信息提示〃,

JOptionPane.INFORMATION_MESSAGE);

)

else

(

JOptionPane.showMessageDialog(null,“抱

歉,您账户没有足够的金额!请查看后重新选择

输入!”,

〃信息提示

〃,JOptionPane.ERROR_MESSAGE);

else

JOptionPane.showMessageDialog(null,“抱

歉,没有找到您要转入的账户信息!请核对后重

新选择输入!〃,〃信息提示〃,

JOptionPane.ERROR_MESSAGE);

jblName=newJLabel("账户姓名:

〃+account.getName());

jblMsg.setText(,z余额:

“+account.getBalanceO);

)

)

);

〃给退卡按钮注册监听器

jbCancel.addActionListener(

newActionListener0{

publicvoid

action

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论