ATM柜员机模拟程序
- 前言
- 一、问题描述
- 二、问题分析
- 三、代码设计
- 1.用户信息类
- 2.ATMMahine类设计,即主要类设计
- 四、完整源代码地址
前言
一、问题描述
模拟ATM柜员机的相关功能,实现存取款、余额查询、密码修改等相关功能,要求采用图形用户界面的
二、问题分析
将程序按功能分步骤解决,在执行各种操作之前先要有用户登录这一功能,所以第一步骤就是做用户登录;因为功能众多,要执行某一功能得由用户来选择,所以第二步骤应该是功能旋转;接下来就是实现各个功能的步骤:取存款功能、余额查询功能、密码修改功能。总体上还是数据与界面分开设计,由界面来查询和修改数据。
界面实现详细步骤:
用户登录功能:登录功能比较简单,分为界面设计和数据处理,登录界面主要有两个输入框输入账号和密码,一个登录按钮执行用户登录的检查账号密码是否正确,然后进入程序,当然还得有个退出功能,用于退出后执行其他用户的操作。
功能选择功能:主要是各个功能的选择按钮,点击任一按钮就进入该功能界面还有一个退出功能按钮,用于退出该功能,选择其他功能。
存取功能:界面设计部分主要有一个文本框输入金额,两个按钮一个进行存功能,一个进行取功能,还有一个退出功能按钮。数据处理方面要根据用户的选择对相应的用户信息进行修改,当然还要错误操作的查错功能,比如当钱少于100时,不能进行取两百元的操作。
余额查询功能:一个文本框显示当前用户的余额,还有一个退出按钮退出该功能。
密码修改功能:一个输入款进行输入新密码,一个确定按钮确认密码修改,一个退出按钮退出功能。
数据设计:
数据方面得有一个包含了所有用户的账号和密码以及各类信息如余额等信息的库,账号和密码用来来标识每一位用户,在登录时检查匹配输入账号和密码是否正确,以及密码修改功能需要修改该密码信息;余额用来在余额查询功能时显现余额,在存取金额时,修改余额。
三、代码设计
1.用户信息类
定义用户类,一个用户必须要有的是账号和密码信息,这是标识每一个用户的重要属性,当然,如果你还想设计的更详细一点的话,可以加上姓名,年龄,性别等信息,这里主要是讲解实现ATM的各类功能,所以只定义了重要的几个属性。一个用户需要有的功能有修改密码和修改自己金额两个主要功能。代码中的其他方法主要用于辅助这两个主要功能。
这其中还有一个静态方法,我把检查输入的账号和密码是否匹配正确写在用户类了,不过直接写在后面的ATMMahicne类里也行,按自己对问题的理解决定写在哪儿。
import java.util.ArrayList;
public class UserConfig {
private String accountString;
private String passWordString;
private Double money;
//构造函数,构造用户类
public UserConfig(String accountString,String passwordString,Double money) {
this.accountString=accountString;
this.passWordString=passwordString;
this.money=money;
}
public String getAccountString() {
return accountString;
}
public String getPassString() {
return passWordString;
}
public Double getMoney() {
return money;
}
//存取功能
public boolean modifyMoney(int type,Double moneyNumber) {
switch(type) {
case 1:
//存钱
money+=moneyNumber;
return true;
case 2:
//取钱
if(money>=moneyNumber) {
money-=moneyNumber;
return true;
}else {
//没那么多钱
return false;
}
}
return false;
}
//修改密码功能
public boolean AlterPassword(String newPassword) {
passWordString=newPassword;
return true;
}
//检查账号密码是否匹配正确的函数。
public static int checkAccount(ArrayList<UserConfig>Users,String accountString,String passWorString) {
for(int i=0;i<Users.size();i++) {
if(accountString.equals(Users.get(i).getAccountString())) {
if(passWorString.equals(Users.get(i).getPassString())) {
return i;
}
//放回-2说明密码错误
return -2;
}
}
//未找到该账号
return -1;
}
}
2.ATMMahine类设计,即主要类设计
分为两部分,一部分是界面设计,一部分是数据处理
界面设计主要包括登录界面,功能选择界面,存钱界面,取钱界面,余额查询界面,密码修改界面。各功能间的光系如下:
以下为各界面的实现代码,函数中有些没有声明就使用的组件,这是因为这些组件里的信息其他地方也需要使用,例如在登录界面时,点击登录按钮执行登录功能时需要获取得到账户输入框和密码输入框的内容进行账号密码匹配,所以我将这类组件都写在类里,供其他函数获取该组件的信息
- 登录界面
public void ShowLoginFrame() {
if(LoginPanel==null) {
JLabel acounJLabel=new JLabel("账号:");
acounJLabel.setBounds(40,10,50,25);
JLabel passwordLabel=new JLabel("密码:");
passwordLabel.setBounds(40,50,50,25);
accounField.setBounds(80,10,200,25);
passwordField.setBounds(80,50,200,25);
JButton loginButton=new JButton("登录");
loginButton.setBounds(120,100,100,25);
loginButton.addActionListener(new ButtonHandler(this, "Login"));
LoginPanel=new JPanel();
LoginPanel.setBounds(0, 0, 400, 200);
LoginPanel.setLayout(null);
LoginPanel.add(acounJLabel);
LoginPanel.add(passwordLabel);
LoginPanel.add(accounField);
LoginPanel.add(passwordField);
LoginPanel.add(loginButton);
ATMFrame.add(LoginPanel,BorderLayout.CENTER);
}
if(nowPanel!=null) {
nowPanel.setVisible(false);
}
accounField.setText("");
passwordField.setText("");
nowPanel=LoginPanel;
nowPanel.setVisible(true);
}
- 功能选择界面
public void ShowFunctionChoosenFrame() {
if(functionChoosenPanel==null) {
JButton quit=new JButton("退出");
quit.setBounds(160, 130, 80, 30);
quit.addActionListener(new ButtonHandler(this,"showLogin"));
JButton moneyDeposit=new JButton("存钱");
moneyDeposit.addActionListener(new ButtonHandler(this, "showDeposit"));
moneyDeposit.setBounds(1, 50, 80, 30);
JButton moneywithdraw=new JButton("取钱");
moneywithdraw.addActionListener(new ButtonHandler(this, "showWithdraw"));
moneywithdraw.setBounds(100, 50, 80, 30);
JButton moneyQuery=new JButton("查询");
moneyQuery.addActionListener(new ButtonHandler(this, "showMoneySearch"));
moneyQuery.setBounds(190, 50, 80, 30);
JButton passwordAlter=new JButton("修改密码");
passwordAlter.addActionListener(new ButtonHandler(this, "showPasswordChange"));
passwordAlter.setBounds(290, 50, 100, 30);
functionChoosenPanel=new JPanel();
functionChoosenPanel.setBounds(0,0,400,200);
functionChoosenPanel.add(quit);
functionChoosenPanel.add(moneywithdraw);
functionChoosenPanel.add(moneyDeposit);
functionChoosenPanel.add(moneyQuery);
functionChoosenPanel.add(passwordAlter);
functionChoosenPanel.setLayout(null);
ATMFrame.add(functionChoosenPanel,BorderLayout.CENTER);
}
if(nowPanel!=null) {
//ATMFrame.remove(nowPanel);
nowPanel.setVisible(false);
}
nowPanel=functionChoosenPanel;
nowPanel.setVisible(true);
System.out.println("进入功能选择界面");
}
- 余额查询界面
public void ShowMoneySearchFrame() {
if(searchMoneyPanel==null) {
searchMoneyPanel=new JPanel();
searchMoneyPanel.setLayout(null);
searchMoneyPanel.setBounds(0,0,400,200);
JButton quitButton=new JButton("退出");
quitButton.setBounds(160, 130, 80, 30);
quitButton.addActionListener(new ButtonHandler(this, "showFunctionChoosen"));
nowUserMoneyLabel.setBounds(160, 50, 80, 30);
searchMoneyPanel.add(quitButton);
searchMoneyPanel.add(nowUserMoneyLabel);
ATMFrame.add(searchMoneyPanel);
}
nowUserMoneyLabel.setText("余额:"+nowUser.getMoney());
if(nowPanel!=null) {
nowPanel.setVisible(false);
}
nowPanel=searchMoneyPanel;
nowPanel.setVisible(true);
}
- 存钱界面,取钱界面与存钱界面相似,就不赘述了
public void ShowDepositFrame() {
if(depositePanel==null) {
depositePanel=new JPanel();
depositePanel.setBounds(0,0,400,200);
depositePanel.setLayout(null);
JLabel moneyJLabel=new JLabel("金额:");
moneyJLabel.setBounds(100,50,60,30);
JButton deposite=new JButton("存钱");
deposite.setBounds(100,100,80,30);
deposite.addActionListener(new ButtonHandler(this, "deposite"));
JButton quit=new JButton("退出");
quit.setBounds(200,100,80,30);
quit.addActionListener(new ButtonHandler(this, "showFunctionChoosen"));
depositePanel.add(quit);
depositePanel.add(deposite);
depositePanel.add(moneyJLabel);
ATMFrame.add(depositePanel);
}
nowUserMoneyText.setBounds(150,50,100,30);
nowUserMoneyText.setText("");
depositePanel.add(nowUserMoneyText);
if(nowPanel!=null) {
nowPanel.setVisible(false);
}
nowPanel=depositePanel;
nowPanel.setVisible(true);
}
- 密码修改界面
public void ShowPasswordAlterFrame() {
if(alterPasswordPanel==null) {
alterPasswordPanel=new JPanel();
alterPasswordPanel.setLayout(null);
alterPasswordPanel.setBounds(0,0,400,200);
newPasswordField.setBounds(130,50,200,30);
JLabel newPassLabel=new JLabel("新密码:");
newPassLabel.setBounds(80,50,80,30);
JButton quitButton=new JButton("退出");
quitButton.setBounds(200,100,80,30);
quitButton.addActionListener(new ButtonHandler(this,"showFunctionChoosen"));
JButton determineButton=new JButton("确定");
determineButton.setBounds(100,100,80,30);
determineButton.addActionListener(new ButtonHandler(this,"determineAlter"));
alterPasswordPanel.add(newPasswordField);
alterPasswordPanel.add(newPassLabel);
alterPasswordPanel.add(quitButton);
alterPasswordPanel.add(determineButton);
ATMFrame.add(alterPasswordPanel);
}
if(nowPanel!=null) {
nowPanel.setVisible(false);
}
nowPanel=alterPasswordPanel;
nowPanel.setVisible(true);
}
界面设计好了,我们还有数据处理设计
- 按钮监听
class ButtonHandler implements ActionListener{
private ATMMahcin ATM;
private String type;
public ButtonHandler(ATMMahcin ATM,String type) {
this.ATM=ATM;
this.type=type;
}
@Override
public void actionPerformed(ActionEvent e) {
switch(type) {
case "showFunctionChoosen":
ATM.ShowFunctionChoosenFrame();
break;
case "showLogin":
ATM.ShowLoginFrame();
break;
case "Login":
ATM.Login();
break;
case "showDeposit":
ATM.ShowDepositFrame();
break;
case "showWithdraw":
ATM.ShowWithdrawFrame();
break;
case "showMoneySearch":
ATM.ShowMoneySearchFrame();
break;
case "showPasswordChange":
ATM.ShowPasswordAlterFrame();
break;
case "determineAlter":
ATM.PasswordAlter();
break;
case "deposite":
ATM.DepositOrWithdraw(1);
break;
case "withdraw":
ATM.DepositOrWithdraw(2);
break;
}
}
}
- 存取钱功能
public void DepositOrWithdraw(int type) {
if(nowUser.modifyMoney(type, Double.parseDouble(nowUserMoneyText.getText()))) {
System.out.println("操作成功");
}else {
System.out.println("操作失败");
}
}
- 修改密码功能
public void PasswordAlter() {
String newPassword=newPasswordField.getText();
if(nowUser.AlterPassword(newPassword)) {
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
}
四、完整源代码地址
java ATM模拟地址