Java图形界面编程模拟ATM自助取款系统

本人学习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

猜你喜欢

转载自blog.csdn.net/m0_37738838/article/details/81408347