本人学习Java时一直想做一个图形界面的程序,所以利用闲暇时间,做了一个Java图形界面编程模拟ATM自助取款系统,界面简洁漂亮,基本功能ATM功能实现。
程序初始时
考号:123456 密码:123456 金额:10000
实现功能:
1、漂亮简洁的图形界面
2、用户登录,注册功能
3、用户存款、取款功能
4、用户查询余额及账户资金使用情况(账户收支情况)
5、用户转账功能
6、更改账户密码功能
7、退卡功能
以下代码可连同注释复制到eclipse中运行,需要先创建同名包和类
Test.java
package atm;
//import javafx.scene.layout.Pane;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static List<Account> usersList;
public static Account currentAccount;//登录的用户
public static File file;//当前用户的记录文件
public static StringBuilder recordString=new StringBuilder();//登录后读取文本中的记录,然后和recordString拼接
public static Menu menu;//静态的菜单界面,用于在更换密码后关闭菜单界面
public static File usersFile;
public static StringBuilder usersString=new StringBuilder();
static Reader fw;
public static void main(String[] args)throws Exception {
usersList = new ArrayList<Account>();
//System.out.println(usersList);
/**********************用户文本**********************/
File users = new File("users.txt");
if (!users.exists()) {
try {
users.createNewFile();
Writer fw = new FileWriter("users.txt");
fw.write("123456 123456 10000");
fw.flush();
fw.close();
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, "创建用户文档失败");
}
}
usersFile = users;//创建用户文档,存储用户账户,密码,余额信息;
usersListRead();
usersListUpdate();
/*****************************Login****************************/
LoginGui loginGui = new LoginGui();
}
public static void usersListRead()
{
/**********************按照用户文档读取用户列表并创建所有用户**********************/
/**********************并写入list**********************/
try {
fw = new FileReader("users.txt");//字符流
} catch (Exception e) {
System.out.println("字符流创建失败");
}
BufferedReader bfr = new BufferedReader(fw);
String temp = "";
try {
System.out.println("开始写入list");
while ((temp = bfr.readLine()) != null) {//不知为何读取出的字符串中最前面会出现Null
String[] tmpstr = new String[5];
tmpstr = temp.split("\\s+");//分割空格
System.out.println("余额:" + tmpstr[2]);
Account a = new Account(tmpstr[0], tmpstr[1], tmpstr[2]);
usersList.add(a);
System.out.println("读取到"+a.id+",实例化用户" + a.id);
}
bfr.close();
fw.close();
System.out.println("用户list:"+usersList);
} catch (Exception e) {
System.out.println("读取用户文档失败");
}
}
public static void usersListUpdate()
{
/**********************按照list内容写入文本用户信息**********************/
try {
Writer fw = new FileWriter("users.txt");
StringBuilder tmpstr = new StringBuilder();
for (int i = 0; i < usersList.size(); i++) {
// System.out.println(Test.currentAccount.id);
tmpstr.append(usersList.get(i).id + " " + usersList.get(i).password + " " + usersList.get(i).money + "\r\n");
//fw.write(Test.currentAccount.id + " " + Test.currentAccount.password + " " + Test.currentAccount.money+"\r\n");
}
fw.write(tmpstr.toString());
fw.flush();
fw.close();
}
catch (Exception e)
{
e.printStackTrace();
System.out.println("更新用户失败");
}
}
}
LoginGui.java
package atm;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class LoginGui implements ActionListener{//实现监听器的接口
private JFrame frame;
private JPanel p0,p1,p2,p3,p4;//p4包括确认密码时的输入框;点击register按钮出现
private JTextField userName;
private JPasswordField passWord,passwordCheck;
private JButton login;
private JButton register,jb3;
private Reader fw;
Boolean regirsterable=true;//控制是否能注册的变量
public LoginGui() {
frame=new JFrame("登录ATM");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗口的点击右上角的x的处理方式,这里设置的是退出程序
p0=new JPanel();
p0.add(new JLabel("中国建设银行ATM系统"));
frame.add(p0);
p1=new JPanel();
p1.add(new JLabel("\t卡号:"));
userName=new JTextField(20);
p1.add(userName);
p2=new JPanel();
p2.add(new JLabel("\t密码:"));
passWord=new JPasswordField(20);
p2.add(passWord);
p3=new JPanel();
login=new JButton(" 登录 ");
register=new JButton(" 注册 ");
jb3=new JButton(" 重置 ");
p3.add(login);
p3.add(register);
p3.add(jb3);
p4=new JPanel();
p4.add(new JLabel("确认密码:"));
passwordCheck=new JPasswordField(20);
p4.add(passwordCheck);
frame.add(p1);
frame.add(p2);
frame.add(p4);//确认密码框
frame.add(p3);
frame.pack();
frame.setVisible(true);
p4.setVisible(false);
show();
/*****************************Login****************************/
}
public void show(){
login.addActionListener(this);//添加监视器
register.addActionListener(this);
jb3.addActionListener(this);
frame.setBounds(500,500,350,250);//设置大小
frame.setLayout(new FlowLayout());//设置流式布局
frame.setLocationRelativeTo(null);//居中
}
public void clear() {
userName.setText("");
passWord.setText("");
passwordCheck.setText("");
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals(" 注册 ")) {//注册,如果监听器获得的按钮文本是这个,也就是点击的按钮文本是这个的话,执行下面的语句
if(p4.isVisible()==false)
{
p4.setVisible(true);//检查密码输入栏
login.setText(" 取消 ");//将login文本改为cancel,同时也能触发作为Cancel的监听器
regirsterable=true;
return;
}
if(regirsterable==true) {
if (userName.getText().equals(""))//如果userName的文本是空
{
JOptionPane.showMessageDialog(frame, "用户名不能为空");//弹窗
return;
}
for (int i = 0; i < Test.usersList.size(); i++) {
if (Test.usersList.get(i).id.equals(userName.getText())) {
JOptionPane.showMessageDialog(frame, "该用户已被注册");
userName.setText("");//清空输入框
passWord.setText("");
passwordCheck.setText("");
return;//如果同名,结束方法,不在运行下面的语句
}
}
//如果执行到这里说明找到用户名
if (passWord.getText().equals("")) {
JOptionPane.showMessageDialog(frame, "密码不能为空,请重新输入");
return;
} else {
if (passwordCheck.getText().equals(passWord.getText())) {
Account registeraccount = new Account(userName.getText(), passWord.getText(), "0");//实例化此账号
JOptionPane.showMessageDialog(frame, "注册成功,请登录");
Test.usersList.add(registeraccount);//加入Test类的静态用户list
Test.usersListUpdate();//更新用户文档
return;
} else {
JOptionPane.showMessageDialog(frame, "两次输入的密码不一致,请重新输入");
return;
}
}
}
}
if(e.getActionCommand().equals(" 重置 ")){
clear();
}
if(e.getActionCommand().equals(" 登录 ")){
for (int i = 0; i < Test.usersList.size(); i++) {
if (Test.usersList.get(i).id.equals(userName.getText())) {
if(passWord.getText().equals(Test.usersList.get(i).password))
{
JOptionPane.showMessageDialog(frame, "登录成功");
Test.currentAccount=Test.usersList.get(i);//将list中符合登陆输入的账户密码的类设为当前Test类中的静态的“当前类”,以便后面各种操作;
Test.file=new File(Test.currentAccount+".txt");
Test.recordString=new StringBuilder();//清空,避免将上一个用户的记录写进新登录的用户中
//Test.recordString.append("");//避免recordString空指针
Menu menu=new Menu();//实例化菜单窗口
Test.menu=menu;
frame.setVisible(false);//隐藏登陆窗口
/************************创建记录文件**********************/
File records = new File(Test.currentAccount.id+".txt");//以账户id命名
if(!records.exists())
{
try {
records.createNewFile();
}
catch (Exception e1)
{
JOptionPane.showMessageDialog(null, "创建该用户的记录失败");
}
}
Test.file=records;
/*****************读取记录文件************/
try {
fw = new FileReader(Test.file);//字符流
}
catch (Exception e1)
{
JOptionPane.showMessageDialog(null, "读取记录失败");
}
BufferedReader bfr=new BufferedReader(fw);
String temp="";
try {
while ((temp = bfr.readLine()) != null) {//不知为何读取出的字符串中最前面会出现Null,但不影响使用
Test.recordString .append(temp);//读取原先该账户的记录的每一行并拼接到Test.recordString中,在inqury类中输出作为查询记录的结果
}
//将记录读取并合并为一个字符串
fw.close();
}
catch (Exception e1)
{
System.out.println("读取记录过程中出现错误");
}
return;
}
else
{
JOptionPane.showMessageDialog(frame, "密码错误");
passwordCheck.setText("");
return;
}
}
}
JOptionPane.showMessageDialog(frame, "该用户不存在");
}
if(e.getActionCommand().equals(" 取消 "))
{
p4.setVisible(false);
login.setText(" 登录 ");
regirsterable=false;//不可注册
}
}
}
ChangePassword.java
package atm;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ChangePassword implements ActionListener{
public JPasswordField oldPassword,newPassword,checkPassword;
public JFrame iframe;
public JPanel ip0,ip1,ip2,ip3,ip4;
public JButton confirm,cancel,exit;
public ChangePassword() {
iframe=new JFrame("更改密码");
iframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
ip2=new JPanel();
ip2.add(new JLabel("原密码:"));
oldPassword=new JPasswordField(20);
ip2.add(new JLabel("<html><br/><html>"));//换行
ip2.add(oldPassword);
ip0=new JPanel();
ip0.add(new JLabel("新密码:"));
newPassword=new JPasswordField(20);
ip0.add(new JLabel("<html><br/><html>"));//换行
ip0.add(newPassword);
ip4=new JPanel();
ip4.add(new JLabel("再次输入新密码:"));
checkPassword=new JPasswordField(20);
ip4.add(new JLabel("<html><br/><html>"));//换行
ip4.add(checkPassword);
ip3=new JPanel();
confirm=new JButton("确定");
ip3.add(confirm);
cancel=new JButton("返回");
ip3.add(cancel);
iframe.add(ip2);
iframe.add(ip0);
iframe.add(ip4);
iframe.add(ip3);
iframe.add(confirm);
iframe.add(cancel);
iframe.setLayout(new FlowLayout());
iframe.setVisible(true);
iframe.setTitle("密码更改");//窗体标签
iframe.setSize(400, 200);//窗体大小
iframe.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
confirm.addActionListener(this);
cancel.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("确定")) {
if (Test.currentAccount.password.equals(oldPassword.getText())) {
try {
if(newPassword.getText().equals(checkPassword.getText())) {
if(newPassword.getText().length()>=6) {
Test.currentAccount.ChangePassword(newPassword.getText());
JOptionPane.showMessageDialog(null, "更改密码成功");
iframe.setVisible(false);
Test.menu.mframe.setVisible(false);//关闭菜单界面
new LoginGui();
}else {
JOptionPane.showMessageDialog(null,"密码不能少于6位!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE);
newPassword.setText("");
oldPassword.setText("");
checkPassword.setText("");
}
}
else
{
JOptionPane.showMessageDialog(null, "两次输入的密码不一致");
}
}
catch (Exception e1) {//捕获账户类中更改密码函数的异常并弹窗显示
JOptionPane.showMessageDialog(null, e1.getMessage());
}
} else {
JOptionPane.showMessageDialog(null, "原密码错误");
}
}
else//如果点击cancel
{
iframe.setVisible(false);
}
}
}
上面展示了部分代码,有兴趣的朋友可以到下面的链接下载
https://download.csdn.net/download/m0_37738838/10512095
运行效果
有兴趣的朋友可以一起交流,QQ:690333105,验证消息:CSDN