用java GUI实现一个ATM机系统(3.0版)

用java GUI实现一个ATM机系统(3.0版)

写个小项目了解一下GUI。用java GUI实现银行ATM自动取款机,实现登录界面、登录成功界面、各个操作功能实现界面;用文件来储存用户数据。

文章目录

  • 用java GUI实现一个ATM机系统(3.0版)
    • 设计思路
    • 源码
      • bank包
      • atmJFrame包

设计思路

设计两个包(bank包,atmJFrame包)
1、bank包:
(1)、ATM类:实现用户各种操作;
(2)、Data类:从user文件中获取所有用户信息,并返回要找的用户,再将修改完之后的用户信息写入user文件中;
(3)、user文件储存所有用户信息。
2、atmJFrame包:
(1)、MyJFrame类:自己创建的界面父类;
(2)、LoginJFrame:登录界面;
(3)、WorkingJFrame:登录成功后显示的功能界面;
(4)、CentreJFrame:中间窗口,存钱、取钱、转账、修改密码界面的父类;
(5)、QuMoneyJFrame:取钱界面;
(6)、CunMoneyJFrame:存钱界面;
(7)、GiveMoneyJFrame:转账界面;
(8)、ChangePasswordJFrame:修改密码界面。

源码

bank包

package bank;

//ATM类
public class ATM {
    //有一个类操作数据的类
    private Data data = new Data();
    //ATM机里的数据
    private String userName;//用户账号且唯一
    private String userPassword;//用户密码
    private double userMoney;//用户账户里的钱
    private String user;//使用该台ATM机的用户全部信息
    private String antherUser;//被转账用户

    //登录方法
    public boolean login(String userNameString,String userPassword1){
        boolean b= false;
        String x = data.backUser(userNameString);
        //判断账户是否存在
        if(!x.equals("null")){
            user = x;//获取用户所有信息
            String[] str = user.split("\\*");//将用户信息分割
            userName = str[0];//用户名
            userPassword = str[1];//用户密码
            userMoney = Double.parseDouble(str[2]);//用户余额
            //密码正确
            if(userPassword.equals(userPassword1))
                b = true;
        }
        return b;
    }
    //获取账户余额
    public Double getMoney1(){
        return userMoney;
    }
    //存钱
    public boolean saveMoney(Double money1){
        boolean b = false;
        if(money1%100 == 0) { //如果存的钱正确
            userMoney = userMoney + money1;//存上
            b = true;
        }
        return b;
    }
    //取钱
    public boolean quMoney(Double money1){
        boolean b = false;
        if(money1%100 == 0 && money1 <= userMoney){
            userMoney = userMoney - money1;
            b = true;
        }
        return b;
    }
    //只判断用户账户是否存在
    public boolean anotherUser(String userName1){
        boolean b = false;
        String inUserName = userName1;
        String str = data.backUser(inUserName);
        //如果该账户存在
        if(!str.equals("null")) {
            antherUser = str;//获取被转账账户所有信息
            b = true;
        }
        return b;
    }
    //进行转账
    public void giveMoney(Double money1){
        String[] str1 = antherUser.split("\\*");//分割
        Double x = Double.parseDouble(str1[2]);//获取被转账账户余额
        x = x + money1;
        userMoney = userMoney - money1;
        antherUser = changeUser(str1[0], str1[1], x);//改变被转账账户信息
        data.saveData(antherUser,false);//将用户信息传给Data类保存被转账账户信息
    }
    //修改密码实现
    public void changePassword(String newPassword){
        userPassword = newPassword;
    }
    //办完业务后修改用户信息
    private String changeUser(String n,String w,Double d){
        String str = n + "*" + w + "*" + d;
        return str;
    }
    //办完所有业务
    public void over(){
        user = changeUser(userName,userPassword,userMoney);
        data.saveData(user,true);
    }
}

package bank;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

//数据类是文件和ATM机之间操作用户信息的桥梁
public class Data {
    //Map储存user文件里所有用户的全部信息
    Map<String,String> userData = new HashMap();
    //返回用户的信息
    private String user;

    //创建数据类加载所有用户信息
    public Data(){
        getUsers();
    }

    private void getUsers(){
        String str;
        String[] string;
        File file = new File("src\\bank\\user");
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        try{
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            while((str = bufferedReader.readLine())!=null){
                string = str.split("\\*",2);
                userData.put(string[0],string[1]);
            }
        }catch(Exception e){
            e.printStackTrace();
            if((fileReader!=null)&&(bufferedReader!=null)){
                try {
                    bufferedReader.close();
                    fileReader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
    }

    //告诉用户名,如果找到返回该用户所有信息,没找到返回null
    public String backUser(String userName){
        String str = "null";
        if(userData.containsKey(userName))
            str = userName + "*" + userData.get(userName);
        user = str;
        return user;
    }
    //修改用户数据并储存在userData图里
    public void saveData(String user,boolean aBoolean){
        String[] string = user.split("\\*",2);
        userData.remove(string[0]);
        userData.put(string[0],string[1]);
        if(aBoolean)//判断用户是否操作结束
            changeUser();
    }

    //用户操作完,将userData里所有的用户再写入文件里
    private void changeUser(){
        String str,string="";
        Set<String> keys = userData.keySet();
        for(String key : keys){
            str = key + "*" + userData.get(key);
            string = string + str + "\n";
        }
        File file = new File("src\\bank\\user");
        FileWriter out = null;
        try {
            out = new FileWriter(file);
            out.write(string);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(out != null){
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

user文件,是直接在idea里创建的File文件,没有后缀,
调用时为"src\bank\user";
也可以创建.txt文件不过在调用时要改为"src\bank\user.txt"。

文件内容的格式:
账号*密码*余额

李四*234*7500.0
张三*123*13100.0
王五*123*1100.0

atmJFrame包

package atmJFrame.myJFrame;

import bank.ATM;

import javax.swing.*;
import java.awt.*;

//自己创造的界面的父类
public class MyJFrame extends JFrame {
    //设置字体供子类使用
    public static final Font FONT_SIZE_10 = new Font("宋体",Font.PLAIN,18);
    public static final Font FONT_SIZE_20 = new Font("宋体",Font.PLAIN,20);
    public static final Font FONT_SIZE_25 = new Font("宋体",Font.PLAIN,25);
    //给一个静态公共不可改变的ATM对象作为属性,供子类使用
    public static final ATM atm = new ATM();
    //创建窗体
    public MyJFrame(String title){
        super(title);
        //设置窗体不可改变
        setResizable(false);
        //设置窗体大小
        setSize(600,600);
        //设置窗体居中
        setLocationRelativeTo(null);
    }
    //无参构造,创建无标题窗体
    public MyJFrame(){
        this("");
    }
    //设置弹窗方法供子类使用(传入字符串并显示出)
    protected void showMessageDialog(String str){
        JOptionPane.showMessageDialog(this,str);
    }
}

package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//登录界面继承MyJFrame
public class LoginJFrame extends MyJFrame {
    public LoginJFrame(){
        super("欢迎使用ATM机");
        //设置窗体可关闭
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置组件
        init();
        //界面可视化
        setVisible(true);
    }
    //初始化界面
    private void init(){
        //创建面板对象,并定义为空布局
        JPanel jp = new JPanel(null);
        //添加标签
        JLabel jl1 = new JLabel("账号:");
        JLabel jl2 = new JLabel("密码:");
        //设置标签字体
        jl1.setFont(FONT_SIZE_20);
        jl2.setFont(FONT_SIZE_20);
        //设置标签在面板中的位置
        jl1.setBounds(100,100,70,70);
        jl2.setBounds(100,250,70,70);
        //添加文本框
        JTextField jtf = new JTextField(20);
        //添加密码文本框
        JPasswordField jpf = new JPasswordField(20);
        //设置文本框位置
        jtf.setBounds(200,115,200,40);
        jpf.setBounds(200,265,200,40);
        //添加按钮
        JButton jb = new JButton("登录");
        //设置按钮文字大小
        jb.setFont(FONT_SIZE_20);
        //设置按钮位置及大小
        jb.setBounds(250,400,100,50);
        //设置面板背景颜色
        jp.setBackground(Color.YELLOW);
        //内部类进行事件处理
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取输入的账号和密码
                String userName = jtf.getText();
                String userPassword = new String(jpf.getPassword());
                //验证是否正确
                boolean aBoolean = atm.login(userName,userPassword);
                if(aBoolean){
                    //登录成功
                    dispose();//关闭登录界面
                    //打开功能界面
                    new WorkingJFrame();
                }
                else
                    showMessageDialog("账号或密码错误");//调用父类弹窗方法
            }
        });
        //添加组件
        jp.add(jl1);
        jp.add(jtf);
        jp.add(jl2);
        jp.add(jpf);
        jp.add(jb);
        //窗体添加面板
        add(jp);
    }
    public static void main(String[] args) {
        new LoginJFrame();//先创建登录界面
    }
}

package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//功能界面
public class WorkingJFrame extends MyJFrame {
    public WorkingJFrame(){
        super("功能界面");
        init();
        setVisible(true);
    }
    //初始化功能界面
    private void init(){
        //设置第一个面板对象
        JPanel jp1 = new JPanel();
        //创建标签,将标签添加到第一个面板上
        JLabel jb = new JLabel("请选择要进行的操作:");
        jb.setFont(FONT_SIZE_25);//设置标签字体大小
        jp1.add(jb);
        jp1.setBackground(Color.CYAN);
        //将第一个面板添加到窗体上方(JFrame窗体是边界布局)
        add(jp1, BorderLayout.NORTH);

        //创建第二个面板对象(空布局,自己设置按钮位置及大小),然后将按钮添加
        JPanel jp2 = new JPanel(null);
        //字符串数组存储各个按钮名字,然后循环设置按钮名字
        String[] str = {"1、余额查询","2、取钱","3、存钱","4、转账","5、修改密码","6、退出系统"};
        //int二维数组储存各个按钮位置及大小信息,循环设置
        int[][] xy = new int[][]{{50,100,200,50},{350,100,200,50},{50,200,200,50},{350,200,200,50},{50,300,200,50},{350,300,200,50}};
        for(int i = 0;i < str.length;i ++){
            JButton jButton = new JButton(str[i]);//创建按钮
            jButton.setFont(FONT_SIZE_20);//设置按钮字体大小
            jButton.setBounds(xy[i][0],xy[i][1],xy[i][2],xy[i][3]);//设置按钮位置及大小
            jButton.addActionListener(listener);//按钮注册监听器
            jp2.add(jButton);//将按钮添加
        }
        //设置jp2背景颜色
        jp2.setBackground(Color.GRAY);
        //将第二个面板添加到窗体(JFrame窗体中间)
        add(jp2);
    }
    //创建事件监听器
    private ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String actionCommand = e.getActionCommand();//获取按钮上的字
            //switch选择功能,且每次功能结束回到该界面,关闭已操作完的功能界面
            switch(actionCommand){
                case "1、余额查询":
                    getMoney();
                    break;
                case "2、取钱":
                    quMoney();
                    break;
                case "3、存钱":
                    cunMoney();
                    break;
                case "4、转账":
                    giveMoney();
                    break;
                case "5、修改密码":
                    changePassword();
                    break;
                case "6、退出系统":
                    over();
                    break;
            }
        }
    };
    //查询余额功能
    private void getMoney(){
        showMessageDialog("您的账户余额为:" + atm.getMoney1());//调用父类方法弹窗
    }
    //取钱功能
    private void quMoney(){
        new QuMoneyJFrame();//创建取钱界面
        dispose();//关闭该界面
    }
    //存钱功能
    private void cunMoney(){
        new CunMoneyJFrame();
        dispose();
    }
    //转账功能
    private void giveMoney(){
        new GiveMoneyJFrame();
        dispose();
    }
    //修改密码功能
    private void changePassword(){
        new ChangePasswordJFrame();
        dispose();
    }
    //退出系统功能
    private void over(){
        atm.over();//调用方法操作文件
        dispose();
    }
}

package atmJFrame.myJFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//中间窗口,存钱、取钱、转账、修改密码界面的父类
public class CentreJFrame extends MyJFrame {
    //空布局面板,自己设置组件位置及大小
    protected JPanel jp = new JPanel(null);
    //输入金额标签
    protected JLabel jl = new JLabel("请输入金额:");
    //输入金额文件框
    protected JTextField jtf = new JTextField(20);
    //确认、取消按钮
    protected JButton jb1 = new JButton("确认");
    protected JButton jb2 = new JButton("取消");

    //转账时转账账号标签
    protected JLabel jLabel = new JLabel("请输入转账账号:");
    //转账时转账账号文本框
    protected JTextField jTextField = new JTextField(20);

    //修改密码时新密码标签
    protected JLabel jLabelCP = new JLabel("请输入新密码(只能为数字):");
    //修改密码时新密码文本框
    protected JTextField jTextFieldCP = new JTextField(20);

    //提醒用户输入金额为100的倍数
    private JLabel jle = new JLabel("( 提示:只能输入100的倍数 )");

    public CentreJFrame(String str){
        super(str);
        //判断要进行的操作
        if(str.equals("转账"))
            init1();
        else if(str.equals("修改密码"))
            init2();
        else
            init();
        one();//最后调用共有
    }
    //取钱和取钱特有组件
    private void init(){
        //输入金额标签,设置字体,位置及大小
        jl.setFont(FONT_SIZE_25);
        jl.setBounds(100,100,200,100);
        //输入金额文本框
        jtf.setBounds(300,250,200,50);
        //添加输入金额标签和输入金额文本框
        jp.add(jl);
        jp.add(jtf);
        setJLE();
    }
    //转账特有组件
    private void init1(){
        init();
        //输入账户标签
        jLabel.setFont(FONT_SIZE_25);
        jLabel.setBounds(100,10,200,40);
        //输入账户文本
        jTextField.setBounds(300,80,200,50);
        //添加输入账户标签和输入账户文本
        jp.add(jLabel);
        jp.add(jTextField);
    }
    //修改密码特有组件
    private void init2(){
        //输入新密码标签
        jLabelCP.setFont(FONT_SIZE_25);
        jLabelCP.setBounds(50,100,400,70);
        //输入新密码文本框
        jTextFieldCP.setBounds(300,215,200,40);
        //添加输入新密码标签和输入新密码文本框
        jp.add(jLabelCP);
        jp.add(jTextFieldCP);
    }
    //共有组件及操作
    private void one(){
        //按钮设置
        jb1.setFont(FONT_SIZE_20);
        jb2.setFont(FONT_SIZE_20);
        jb1.setBounds(300,350,100,50);
        jb2.setBounds(450,350,100,50);
        jp.add(jb1);
        jp.add(jb2);
        jp.setBackground(Color.GREEN);
        jb1.addActionListener(listener);
        jb2.addActionListener(listener);
        //添加到窗体
        add(jp);
        setVisible(true);
    }

    //设置提示
    private void setJLE(){
        jle.setFont(FONT_SIZE_10);
        jle.setBounds(100,180,300,50);
        jp.add(jle);
    }

    //创建监听器
    private ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {//按钮被点击后
            String actionCommand = e.getActionCommand();//获取按钮上的字
            switch(actionCommand){
                case "确认":
                    change();
                    break;
                case "取消":
                    new WorkingJFrame();//创建功能界面
                    dispose();//关闭此界面
                    break;
            }
        }
    };
    //点击确认按钮执行的操作,子类重写覆盖实现各自功能
    protected void change(){
    }

    //正则表达式判断输入是否为数字
    protected boolean isNumber(String str){
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if(!isNum.matches())
            return false;
        return true;
    }
}

package atmJFrame.myJFrame;

//取钱界面
public class QuMoneyJFrame extends CentreJFrame {
    public QuMoneyJFrame(){
        super("取钱");
    }
    protected void change(){
        String s = jtf.getText();
        if(isNumber(s)){
            Double money = Double.parseDouble(s);
            boolean b = atm.quMoney(money);
            if(b){
                showMessageDialog("请收好您的钱\n您的账户余额为:" + atm.getMoney1());
            }
            else
                showMessageDialog("您输入有误" );
        }
        else
            showMessageDialog("您输入有误" );
        jtf.setText("");
    }

}

package atmJFrame.myJFrame;

//存钱界面
public class CunMoneyJFrame extends CentreJFrame {
    public CunMoneyJFrame(){
        super("存钱");
    }
    protected void change(){
        String s = jtf.getText();
        if(isNumber(s)){
            Double money = Double.parseDouble(s);
            boolean b = atm.saveMoney(money);
            if(b)
                showMessageDialog("您的钱钱已存入\n您的账户余额为:" + atm.getMoney1());
            else
                showMessageDialog("您输入有误" );
        }
        else
            showMessageDialog("您输入有误" );
        jtf.setText("");
    }

}

package atmJFrame.myJFrame;

//转账界面
public class GiveMoneyJFrame extends CentreJFrame {
    public GiveMoneyJFrame(){
        super("转账");
    }
    protected void change(){
        String s = jTextField.getText();
        boolean b = atm.anotherUser(s);
        if(b){
            //获取输入金额
            String s1 = jtf.getText();
            if(isNumber(s1)){//如果输入是数字
                Double money = Double.parseDouble(s1);
                atm.giveMoney(money);
                showMessageDialog("钱已转入\n您的账户余额为:" + atm.getMoney1());
            }
            else
                showMessageDialog("您输入有误" );
        }
        else
            showMessageDialog("您输入有误" );
        new WorkingJFrame();//创建功能界面
        dispose();//关闭此界面
    }
}


package atmJFrame.myJFrame;

//修改密码界面
public class ChangePasswordJFrame extends CentreJFrame{
    public ChangePasswordJFrame(){
        super("修改密码");
    }

    protected void change(){
        String s = jTextFieldCP.getText();
        if(isNumber(s)){
            atm.changePassword(s);
            showMessageDialog("密码修改成功");
        }
        else
            showMessageDialog("您输入有误" );
        new WorkingJFrame();//创建功能界面
        dispose();//关闭此界面
    }

}

最后运行LoginJFrame类就行了。

你可能感兴趣的:(java小项目,java)