[课程设计]Java实现图形化窗口界面可存储ATM机(自助取款机)

2023-10-29

[很久以前写的了,没想到这么多浏览了,现在看着不是一般的乱..当时刚学java,望见谅,不过现在也没有闲工夫重写和心情修改了,凑活凑活吧]

这是一个使用io流和swing库制作的可存储的窗口化ATM机程序;臭不要脸的发上来敲打

实现的功能有:1.登录和注册用户(虽然现实中的ATM中没有注册功能敲打

2.存款

3.取款

4.查询记录,包括存款和取款和转账的记录

5.更改密码

6.退卡


类的构成:1.Test类,实现读取用户文档并更新用户文档的功能;

2.LoginGui类,登录界面,实现登录和注册等功能;

3.Menu类,菜单界面

4.InMoney,OutMoney,Inqury,Transfer类,ChangePassword,分别为存款界面,取款界面,查询界面,转账界面,更改密码界面

5.Account,账户类,实现账户的各种功能,包括存款,取款,转账,更改密码等


项目思路:1.该项目中通过文本来保存用户信息和操作记录,用户信息存储在users.txt中,用户的记录存储在相应用户的用户名.txt中,在程序开始时,调用Test类中的

usesrListRead方法读取users文档,将信息读入程序,得到用户信息,创建用户的List(Tset类中的usersList),并创建用户;


2.首先在登陆界面进行登陆或注册,进行合法性验证,若能成功注册,创建相应的Account类,并创建相应的记录文本,然后要求登录。如果能成功登陆,将Tes

t中的静态变量currentAccount(当前登录的用户)设置为该用户,之后的操作对这个用户进行操作。本程序中

有一个默认用户,id为admin,密码为123456,可以直接登录。记录文本用来存储用户的操作,在后面的每一步操

作中都会通过io流写入记录文本;


3.登陆后弹出菜单,点击按钮弹出相应界面,使用功能后将记录根据文件名存储在用户相应的记录文件中,然后每一次用户状态改变时(使用功能后)都会调

用Test类中的usersListUpdate对用户文档进行更新。这样关闭程序后下次再打开程序时再读取文档就能恢复信息。也就是完成了保存功能。

4.各个界面均是使用java自带的swing库实现的。


注意:1.Test类中使用了很多静态变量来进行全局传值。Test.xxx什么都表示是Test  类中的静态变量。

     2.不能同时用read和write对同一个文件进行操作,否则会清空文件 ,应注意

流的关闭


源码下载地址:链接:点击打开链接 点击打开链接 密码: 3fy5


实现的功能截图:

登录:


菜单及总功能界面:



具体代码:

Test类(测试类)

package mybank;

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("admin  12345   88888");
                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("更新用户失败");
    }

    }
}

Account类(账户类)

方法主要写在这里面。

package mybank;
import com.sun.deploy.util.SyncFileAccess;
import com.sun.org.apache.regexp.internal.RE;

import javax.swing.*;
import  java.io.*;
import java.text.SimpleDateFormat;
import  java.util.*;
public class Account {
    int money;
    String id;//账号名

    String password;
    Date now=new Date();
    Date currentTime;
    SimpleDateFormat formatter;
    Reader fr;
    ;
    public Account(String id, String password, String money) {//构造方法
        this.id = id;

        this.password = password;
        this.money=Integer.parseInt(money);
    }







    public void outMoney (int money)throws Exception {//抛出异常,由相关的界面类弹窗处理异常,下面几个方法同理
        //如在取钱界面取钱,则会调用此函数,进行try/catch处理,获得这个函数的异常,弹窗说明异常
        if (money > this.money) {
            throw new Exception("余额不足");
        }
        if(money<0)
        {
            throw new Exception("不能取出负数");
        }
        formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//时间格式
        currentTime = new Date();//当前时间
        String dateString = formatter.format(currentTime);//处理当前时间格式
        Writer fw = new FileWriter(Test.file);
        fw.write(Test.recordString.append(dateString + "\t" + Test.currentAccount.id + "\t取出" + money + "元\r\n").toString());//将这次的取钱行为添加到记录文件中
        fw.flush();//写进文件
        fw.close();
        this.money -= money;
        Test.usersListUpdate();//更新用户文档(信息)
    }

    public void inMoney(int money)throws Exception
    {
        try {
            Writer fw = new FileWriter(Test.file);
           // System.out.println(Test.file);
            formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
            currentTime=new Date();
            String dateString=formatter.format(currentTime);
            fw.write(Test.recordString.append(dateString+"\t"+Test.currentAccount.id+"\t存入" + money + "元\r\n").toString());
            fw.flush();//写进文件
            fw.close();

            this.money+=money;

            Test.usersListUpdate();//更新当前用户信息

        }
        catch (Exception e1)
        {
            throw new Exception("写入记录失败");
        }

    }

    public void transfer(int money,String id)throws Exception//转账
    {
        if(id.equals(Test.currentAccount.id))
        {
            throw new Exception("不能转给自己");
        }
        if(money>this.money)
        {
            throw new Exception("余额不足");
        }
        if(money<0) {
            throw new Exception("不能转入负数");
        }


        for(int i=0;i<Test.usersList.size();i++)
        {
            if(Test.usersList.get(i).id.equals(id))//找到要转帐的用户
            {
                Test.usersList.get(i).money+=money;//转入
                this.money-=money;//扣钱

                FileWriter fw=new FileWriter(Test.file);
                formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//声明时间格式
                currentTime=new Date();//获取当前时间
                String dateString=formatter.format(currentTime);//转换时间格式
                fw.write(Test.recordString.append(dateString+"\t向"+id+"\t转出"+money+"元\r\n").toString());//Test类中的静态字符串拼接上这个字符串覆盖写入当前用户文档
                fw.close();

                /********************向转入目标写入转账信息*************************/
                try {
                fr = new FileReader(id+".txt");//字符流
                 }
                 catch (Exception e)
                 {
                System.out.println("字符流创建失败");
                }

                BufferedReader bfr = new BufferedReader(fr);

                String temp="";
                String temp1;

                while ((temp1 = bfr.readLine()) != null)
                {
                    temp+=temp1;
                }
                temp=temp.replace("元","元\n\r")+dateString+"\t由"+Test.currentAccount.id+"\t转进"+money+"元\r\n";
                System.out.println(temp);
                fw=new FileWriter(id+".txt");
                fw.write(temp);
                fw.close();


                JOptionPane.showMessageDialog(null,"转账成功");
                Test.usersListUpdate();//更新用户文档

                return;
            }
        }
        throw new Exception("目标用户不存在");
    }

    public void ChangePassword(String newPassword)throws Exception
    {
     if(newPassword.equals(this.password))
     {
         throw new Exception("原密码和新密码不能一样");
     }

     else
     {
         if(newPassword.equals(""))
         {
             throw new Exception("密码不能为空");
         }

     }
     password=newPassword;
        Test.usersListUpdate();


    }



}


LoginGui类(登录界面)

package mybank;

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 JTextField passWord,passwordCheck;
    private JButton login;
    private JButton register;
    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("\tUserName:"));
        userName=new JTextField(20);
        p1.add(userName);

        p2=new JPanel();
        p2.add(new JLabel("\tPassword:"));
        passWord=new JTextField(20);
        p2.add(passWord);


        p3=new JPanel();

        login=new JButton("     Login    ");
        register=new JButton("   Register   ");
        p3.add(login);
        p3.add(register);

        p4=new JPanel();
        p4.add(new JLabel("PasswordCheck:"));
        passwordCheck=new JTextField(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);
        frame.setBounds(500,500,350,250);//设置大小
        frame.setLayout(new FlowLayout());//设置流式布局
    }




    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getActionCommand().equals("   Register   ")) {//注册,如果监听器获得的按钮文本是这个,也就是点击的按钮文本是这个的话,执行下面的语句
            if(p4.isVisible()==false)
            {
                p4.setVisible(true);//检查密码输入栏
                login.setText("     Cancel    ");//将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("     Login    ")){
            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("     Cancel    "))
        {
            p4.setVisible(false);
            login.setText("     Login    ");
            regirsterable=false;//不可注册
        }


    }
}


Menu类(菜单界面)

package mybank;

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

public class Menu implements ActionListener{
    public JFrame mframe;
    private JPanel mp0,mp1,mp2,mp3,mp4;//p4是确认密码;点击register按钮石出现


    private JTextField passWord,passwordCheck;
    private JButton inqury;
    private JButton outmoney;
    private JButton transfer;
    private JButton inmoney;
    private JButton changepassword;


    public Menu()
    {
        mframe=new JFrame();
        mframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JButton inqury=new JButton("查询");
        JButton outmoney=new JButton("取款");
        JButton transfer=new JButton("转账");
        JButton inmoney=new JButton("存款");
        JButton changepassword=new JButton("更改密码");
        JButton exit=new JButton("退卡");
        mp0=new JPanel();
        mp0.add(new JLabel("选择项目"));
        mframe.add(mp0);
        mp1=new JPanel();

        mp1.add(inmoney);
        mp1.add(inqury);
        mp1.add(outmoney);
        mp1.add(transfer);
        mp1.add(changepassword);
        mp1.add(exit);

        mp1.setLayout(new GridLayout(3,2,20,20));
        mframe.add(mp1);
        mframe.pack();
        mframe.setVisible(true);
        mframe.setLayout(new FlowLayout());
        mframe.setBounds(500,500,450,300);
        inqury.addActionListener(this);//绑定监听器
        inmoney.addActionListener(this);
        outmoney.addActionListener(this);
        transfer.addActionListener(this);
        changepassword.addActionListener(this);
        exit.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String cmd=e.getActionCommand();//cmd赋值为点击的按钮的值
        if(cmd.equals("查询"))
        {
        Inqury inquryGui=new Inqury();
        }
        else if(cmd.equals("取款"))
        {
        OutMoney outMoneyGui=new OutMoney();
        }
        else if(cmd.equals("存款"))
        {
        InMoney inMoney=new InMoney();
        }else if(cmd.equals("转账"))
        {
        Transfer transfer=new Transfer();
        }else if(cmd.equals("更改密码"))
        {
        ChangePassword changePassword=new ChangePassword();
        }
        else if(cmd.equals("退卡")){

            mframe.setVisible(false);//隐藏
            LoginGui loginGui=new LoginGui();
            JOptionPane.showMessageDialog(null,"请记得取走你的银行卡");
        }
       
    }
}


InMoney类(存款界面)

package mybank;

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

public class InMoney implements ActionListener{
    public JTextField money;
    public JFrame iframe;
    public JPanel ip0,ip1,ip2,ip3;
    public JButton confirm,cancel,exit;
    public JLabel yue;
    public InMoney() {
        iframe=new JFrame("存款");

        ip0=new JPanel();
        ip0.add(new JLabel("账户id:"+Test.currentAccount.id));

        ip1=new JPanel();
        yue=new JLabel("账户余额:"+Test.currentAccount.money);
        ip1.add(yue);

        ip2=new JPanel();
        ip2.add(new JLabel("存款金额:"));
        money=new JTextField(20);
        ip2.add(money);

        ip3=new JPanel();
        confirm=new JButton("确定");
        ip3.add(confirm);
        cancel=new JButton("返回");
        ip3.add(cancel);

        iframe.add(ip0);
        iframe.add(ip1);
        iframe.add(ip2);
        iframe.add(confirm);
        iframe.add(cancel);
        iframe.setLayout(new FlowLayout());
        iframe.setVisible(true);

        iframe.setBounds(500,500,350,300);
        confirm.addActionListener(this);//绑定监听器

        cancel.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("确定"))//按下确定按钮
        {
            try {

                Test.currentAccount.inMoney(Integer.parseInt(money.getText()));//调用当前登陆账户的存钱函数

                JOptionPane.showMessageDialog(null, "存款成功");//弹窗
                yue.setText("账户余额:"+Test.currentAccount.money);
            }
            catch (ClassCastException e1)//捕获当前登录账户中inmoney函数中的异常。类型转换异常
            {

                JOptionPane.showMessageDialog(null, "输入数据类型错误,请输入整数");

            }
            catch (Exception e1)//
            {
                JOptionPane.showMessageDialog(null, e1.getMessage());
            }
        }
        else
        {
        iframe.setVisible(false);//隐藏

        }
    }
}


Inqury类(查询类)

package mybank;

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

public class Inqury implements ActionListener{
    public JFrame iframe;
    public JPanel ip0,ip1,ip2;
    public JTextArea inquryresult;
    public JButton confirm,cancel,exit;
    public JLabel yue;
    public Inqury() {
        iframe=new JFrame("查询");

        ip0=new JPanel();
        ip0.add(new JLabel("账户id:"+Test.currentAccount.id));
        ip1=new JPanel();
        yue=new JLabel("账户余额:"+Test.currentAccount.money);
        ip1.add(yue);
        ip2=new JPanel();
        inquryresult=new JTextArea(10,30);
        ip2.add(inquryresult);
        confirm=new JButton("查询记录");
        confirm.addActionListener(this);
        iframe.add(ip0);
        iframe.add(ip1);
        iframe.add(ip2);
        iframe.add(confirm);
        iframe.setLayout(new FlowLayout());
        iframe.setVisible(true);

        iframe.setBounds(500,500,350,300);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("查询记录"));
        {
            //Test.recordString是从账户文档中度去处的字符串
            //在写入文本时/r/n才是换行,但在java中\r\n则是两个换行,而且Test.recordString是一行一行读取出来的拼接上的,所以并没有换行符,所以这里替换成一个\n
            inquryresult.setText(Test.recordString.toString().replace("元","元\n").replace("null",""));//去除掉结果字符串中的null,并将元替换为元\r\n来换行换行
            yue.setText("账户余额:"+Test.currentAccount.money);//更新显示余额
        }
    }
}

OutMoney类(取款)

package mybank;

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

public class OutMoney implements ActionListener{
    public JTextField money;
    public JFrame iframe;
    public JPanel ip0,ip1,ip2,ip3;
    public JButton confirm,cancel,exit;
    public JLabel yue;//余额
    public OutMoney() {
        iframe=new JFrame("取款");

        ip0=new JPanel();
        ip0.add(new JLabel("账户id:"+Test.currentAccount.id));

        ip1=new JPanel();
        yue=new JLabel("账户余额:"+Test.currentAccount.money);
        ip1.add(yue);

        ip2=new JPanel();
        ip2.add(new JLabel("取款金额:"));
        money=new JTextField(20);
        ip2.add(money);

        ip3=new JPanel();
        confirm=new JButton("确定");
        ip3.add(confirm);
        cancel=new JButton("返回");
        ip3.add(cancel);

        iframe.add(ip0);
        iframe.add(ip1);
        iframe.add(ip2);
        iframe.add(confirm);
        iframe.add(cancel);
        iframe.setLayout(new FlowLayout());
        iframe.setVisible(true);

        iframe.setBounds(500,500,350,300);
        confirm.addActionListener(this);

        cancel.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("确定"))//点击确定按钮
        {
            try {

                Test.currentAccount.outMoney(Integer.parseInt(money.getText()));

                JOptionPane.showMessageDialog(null, "取款成功");//弹窗
                yue.setText("账户余额:"+Test.currentAccount.money);//更新余额显示
            }
            catch (ClassCastException e1)
            {

                JOptionPane.showMessageDialog(null, "输入数据类型错误,请输入整数");//捕获Test类中outmoney方法的异常

            }
            catch (Exception e1)
            {
                JOptionPane.showMessageDialog(null, e1.getMessage());
            }
        }
        else
        {
            iframe.setVisible(false);//隐藏

        }
    }
}

Transfer类(转账)

package mybank;

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

public class Transfer implements ActionListener{
    public JTextField money,other;
    public JFrame iframe;
    public JPanel ip0,ip1,ip2,ip3,ip4;
    public JButton confirm,cancel,exit;
    public JLabel yue;
    public Transfer() {
        iframe=new JFrame("转账");

        ip0=new JPanel();
        ip0.add(new JLabel("账户id:"+Test.currentAccount.id));

        ip1=new JPanel();
        yue=new JLabel("账户余额:"+Test.currentAccount.money);
        ip1.add(yue);

        ip2=new JPanel();
        ip2.add(new JLabel("转账账户id:"));
        other=new JTextField(10);
        ip2.add(other);

        ip4=new JPanel();
        ip4.add(new JLabel("转账金额:"));
        money=new JTextField(10);
        ip4.add(new JLabel("<html><br/><html>"));//换行
        ip4.add(money);

        ip3=new JPanel();
        confirm=new JButton("确定");
        ip3.add(confirm);
        cancel=new JButton("返回");
        ip3.add(cancel);

        iframe.add(ip0);
        iframe.add(ip1);
        iframe.add(ip2);
        iframe.add(ip4);
        iframe.add(ip3);
        iframe.setLayout(new FlowLayout());
        iframe.setVisible(true);

        iframe.setBounds(500,500,350,300);
        confirm.addActionListener(this);

        cancel.addActionListener(this);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("确定"))
        {
            try {

                Test.currentAccount.transfer(Integer.parseInt(money.getText()),other.getText());

                yue.setText("账户余额:"+Test.currentAccount.money);//更新面板上的余额
            }

            catch (Exception e1)
            {
                JOptionPane.showMessageDialog(null, e1.getMessage());
            }
        }
        else
        {
            iframe.setVisible(false);

        }
    }
}

ChangePassword类(更改密码)

package mybank;

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

public class ChangePassword implements ActionListener{
    public JTextField 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 JTextField(20);
        ip2.add(new JLabel("<html><br/><html>"));//换行
        ip2.add(oldPassword);

        ip0=new JPanel();
        ip0.add(new JLabel("新密码:"));
        newPassword=new JTextField(20);
        ip0.add(new JLabel("<html><br/><html>"));//换行
        ip0.add(newPassword);

        ip4=new JPanel();
        ip4.add(new JLabel("再次输入新密码:"));
        checkPassword=new JTextField(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.setBounds(500,500,350,300);
        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())) {

                        Test.currentAccount.ChangePassword(newPassword.getText());
                        JOptionPane.showMessageDialog(null, "更改密码成功");
                        iframe.setVisible(false);
                        Test.menu.mframe.setVisible(false);//关闭菜单界面
                        new LoginGui();
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "两次输入的密码不一致");
                    }
                }
             catch (Exception e1) {//捕获账户类中更改密码函数的异常并弹窗显示
                    JOptionPane.showMessageDialog(null, e1.getMessage());
                }
            } else {

                JOptionPane.showMessageDialog(null, "原密码错误");
            }
        }
        else//如果点击cancel
        {
            iframe.setVisible(false);
        }
    }
}




本人是一名大二的学生,目前只学了一学期的java,因此有很多不规范的地方,请见谅。

这个程序技术含量并不高,在计划做的时候觉得很简单,但实际上写的时候,发现有一些细节逻辑比较难以处理和混乱,花费了我一周的时间,其中修复逻辑上的bug花了60%的时间,所以想发出来纪念一下。

我第一次写这么大的java程序,所以可能会有些混乱和有些多余的代码,但我详细的写了注释。希望能帮助到

需要帮助的朋友。若有问题,欢迎交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[课程设计]Java实现图形化窗口界面可存储ATM机(自助取款机) 的相关文章

  • 包 javax.comm 不存在[重复]

    这个问题在这里已经有答案了 可能的重复 如何获取javax comm API https stackoverflow com questions 7562565 how to get javax comm api 我已经下载并安装了jdk1
  • OSGI - 处理捆绑包所需的第 3 方 JAR

    我刚刚开始 OSGI 开发 正在努力了解如何最好地处理依赖的 JAR 也就是说 如果我要创建一个捆绑包 我很可能需要使用一些第 3 方 JAR 当我创建要部署到 OSGI 的捆绑包 JAR 时 显然不包含这些第 3 方 JAR 因此该捆绑包
  • Intellij Idea:导入Gradle项目-尚未定义JAVA_HOME

    Intellij 理念 14 1 4 Mac OS X Yosemite 10 10 3 及更高版本 从 IDE Import Project gt Chosen directory to import gt Import project
  • Import 语句顺序有什么影响吗?

    这个疑问由来已久 当我使用 eclipse 编写类时 导入语句会自动填充 import语句的顺序有影响吗 1 关于编程执行速度 2 任何标准编码实践都是相同的 import语句对执行速度没有影响at all 它们仅在编译时重要 如果您完全限
  • 在 eclipse indigo 中找不到 Window builder pro

    我读到 Eclipse Indigo 安装了 Window Builder Pro 插件 但我不知道它在哪里 文件 新建 项目没有给我选择 Window Builder Pro 的选项 如何找到它 您需要将此更新站点添加到 Eclipse
  • Java:是否有工具可以使代码(在第 3 方 JAR 中)向前兼容(1.4 - 1.6)

    我有一个使用 Java 1 4 编译的第 3 方 JAR 文件 有没有一个工具可以使jar文件兼容Java 1 6 类似于 retrotranslator 但它的反面是什么 我尝试反编译类文件并在 1 6 中重新编译它们 但失败了 问题是这
  • HK2 MethodInterceptor 与 Jersey 资源

    如何设置aopMethodInterceptor使用泽西岛资源 这是我尝试过的 如下this https hk2 java net 2 2 0 aop example html文档 第 1 步 拦截服务 public class MyInt
  • Java 8 Arraylist 巨大容量(int) 实现

    我正在阅读文档了解如何ArrayListJava 中的 s 已增长 我不明白为什么hugeCapacity int minCapacity http grepcode com file repository grepcode com jav
  • 如何解决 MongoWaitQueueFullException?

    我运行一个java程序 它是一个线程执行程序 它将数千个文档插入到mongodb中的表中 我收到以下错误 Exception in thread pool 1 thread 301 com mongodb MongoWaitQueueFul
  • 我怎样才能修复这段代码中的这个错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我运行 jUnit 测试时 我在 testSetName 上遇到错误 这是为什么 因为测试是为了查看名称是否为 ferndown 以及它
  • 为什么桌面 AES 文件 IO 与 Android AES 文件 IO 不兼容?

    我已将一个应用程序从 Android 移植到桌面 该应用程序使用 AES 加密一些私人数据 两个应用程序都能够加密和解密数据以供自己使用 但无法解密其他应用程序的数据 AES 密钥 IV 和算法是相同的 这两个应用程序之间的主要区别在于 a
  • 如何一次又一次地使用同一个迭代器?

    给出下一个代码 这是某个大型方法的一部分 ArrayList
  • 从内存中获取Java类字节码(经过多次转换)

    我正在为 Minecraft 开发一个 coremod 并在加载许多类时对其进行转换 然而问题是 有多个 coremod 也转换了与我相同的类 并且我遇到了一些我想研究的奇怪行为 那么问题来了 经过多次转换后的字节码如何检查呢 当我转换它时
  • 构造函数中的同步块

    我有一个带有静态变量的类 如下所示 private static Object sMyStaticVar 如果我想在构造函数中为这个 var 赋值 我有这样的代码 if sMyStaticVar null sMyStaticVar new
  • 如何在 jformattedtextfield 中仅添加双精度值

    我需要格式化 jformattedtextfield 以便在运行时仅添加具有两位小数的双精度 浮点值 例如 15600 00 请帮我解决这个问题 谢谢 以下是有关如何执行此操作的示例 NumberFormat format DecimalF
  • 封闭实例的匿名类

    我正在阅读 Joshua Bloch 的 Effective Java 第二版 目前我在第 22 项 它描述了内部类和嵌套类 但我无法理解他这句话的意思 匿名类具有封闭实例当且仅当它们发生时 在非静态上下文中 有人能给我一个代码示例并解释它
  • Runtime.getRuntime().exec(),执行Java类

    我正在从我的应用程序内部执行 Java 类 proc Runtime getRuntime exec java Test 我怎样才能识别是否Test执行成功与否 即没有例外 重定向输出 错误 proc Runtime getRuntime
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记
  • 在java中使用共享密钥加密/解密?

    我有客户令牌 我正在从一个 Web 应用程序 如 app1 发送到另一个 Web 应用程序 如 app2 我想加密客户令牌 在 app1 上 并使用在 app1 和 app2 上共享的密钥在 app2 上对其进行解密 我不知道如何开始 这将
  • Java无限信号量

    想知道如何not使用信号量限制连接 或任何东西 所以你可能会想 这听起来很愚蠢 但是 它稍微简化了我的代码 因为它让我可以统一处理有限和无限的情况 请注意 我并不是在寻找有关如何编写类似内容的建议 if limited semaphore

随机推荐

  • mongodb如何使用授权登录

    前言 mongodb默认是不需要授权登录的 这样在实际生产环境中是非常危险的一件事情 接下来就来讲一下如何开启安全授权访问 1 第一次登录不启动授权 默认就是不启动 我们先来创建admin和root账号 他们是用来开启授权后操作用户 创建数
  • PWNHUB 一场新鲜赛事速达【六月内部赛】 web - login game + Misc - 伏羲八卦

    PWNHUB 一场新鲜赛事速达 六月内部赛 web login game Misc 伏羲八卦 web login game Misc 伏羲八卦 本文来自csdn的 shu天 平时会记录ctf 取证和渗透相关的文章 欢迎大家来我的主页 shu
  • thinkpad笔记本如何进bios设置u盘启动步骤

    thinkpad笔记本从u盘启动有两种方法 一种是使用u盘启动快捷键直接进入u盘装系统 另一种则需要进bios设置u盘为第一启动项 但首先要下载个u盘启动盘制作工具制作成启动u盘在进行 下面详细为大家介绍如何操作 方法一 使用u盘启动快捷键
  • 脚本一:编写一个脚本要求检测文件类型(简化版)

    要求 1 命名为check file sh 2 检测判断它是否存在 3 判断它是否为普通文件 4 判断其是否为目录 5 判断其是否为软链接 6 如没有文件名则报错 编写脚本如下 验证文件如下 可见如果文件不存在 直接报错 如果符合条件直接给
  • 《Web安全基础》05. XSS · CSRF · SSRF · RCE

    web 1 XSS 1 1 简介 1 2 防护与绕过 1 2 1 HttpOnly 1 2 2 WAF 绕过 1 3 相关资源 2 CSRF 3 SSRF 4 RCE 本系列侧重方法论 各工具只是实现目标的载体 命令与工具只做简单介绍 其使
  • 行人属性识别的一个调研

    行人属性识别的一个调研 知乎 前言 我感觉我掌握了财富密码 从知乎的后台数据来看 大家貌似更喜欢看综述多一点 因此这次给大家整个 行人属性识别 PAR 的综述 同样的 这次的综述比较老 是19年的 大家酌情看 适合入门用 首先还是保命时刻
  • 【会议分享】2022年智能车国际会议(ICoIV 2022)

    2022年智能车国际会议 ICoIV 2022 重要信息 会议网址 www icoiv org 会议时间 2022年10月14 16日 召开地点 中国成都 截稿时间 2022年8月30日 录用通知 投稿后2周内 收录检索 EI Scopus
  • 爬虫从入门到精通(8)

    文章目录 一 多进程和多线程介绍 二 普通爬虫 三 多线程爬虫 1 普通方法调用 2 线程类调用 四 多进程爬虫 1 普通方法调用 2 进程类写法 五 gevent协程爬虫 1 gevent模块简介 2 安装和依赖 3 gevent协程爬虫
  • 【深度学习】AlexNet

    从AlexNet开始 一 不可否认 深度学习的热潮正是由2012年AlexNet的出现而引发的 因此 学习AlexNet网络的结构 对于CNN的学习与理解是不可或缺的 在本篇博客中 将会对AlexNet的论文进行翻译与解读 并在下一篇博客中
  • android 壁纸服务,Android-Service实现手机壁纸自动更换

    本文实例为大家分享了Android Service实现自动更换手机壁纸的具体代码 供大家参考 具体内容如下 先看下效果 使用界面 划重点 使用service前别忘了给相应的service添加服务 具体实现 首先定义ChangeService
  • Dialog的exec和open

    今天在使用窗口时 发现了这样一个问题 抽象代码如下 结果第一次调用窗口时 一切正常 但是第二次调用时 窗口里的内容全部消失了 只有一个空白窗口 解决方法 调用open 函数 exec 函数会将程序卡到那里 open 函数生成窗口后立即返回
  • 祭旗之作

    渺小的我 一如原来那样的懒散 我拼命的使自己跟的牛人学习 但是 我总是掉队 我不愿意平庸 但是对于任何事情感觉都是没有坚持到最后 应该更加的坚持 犹豫与多虑 是我的性格 我渴望一直坚持下去 但好多时候 由于时间的关系 选择了放弃 我依然是我
  • SGL基本思路讲解

    SGL图形库是为Windows图形界面编程服务的 而且一切都是考虑到对新手友好的 在具体介绍提供给用户的函数之前 需要先说明一下应该以什么样的思路来构思我们的SGL程序 作为C语言程序 main函数总是需要在最开始就了解一下的 在SGL库中
  • STM32的中断与事件

    这张图是一条外部中断线或外部事件线的示意图 图中信号线上划有一条斜线 旁边标志19字样的注释 表示这样的线路共有19套 图中的蓝色虚线箭头 标出了外部中断信号的传输路径 首先外部信号从编号1的芯片管脚进入 经过编号2的边沿检测电路 通过编号
  • 多线程-单例模式 - Double Check Lock - Volatile

    单例模式 Singleton 保证一个类在程序中仅有一个实例 并提供一个访问该实例的全局访问点 单例模式的实现 饿汉模式 设计思想 在类加载时就创建一个不可变的静态的单例对象 如果该对象不被使用 则浪费了堆空间的资源 问题1 为什么加fin
  • 一文详解 RSA 非对称加密算法

    RSA加密算法是一种非对称加密算法 RSA是1977年由罗纳德 李维斯特 Ron Rivest 阿迪 萨莫尔 Adi Shamir 和伦纳德 阿德曼 Leonard Adleman 一起提出的 当时他们三人都在麻省理工学院工作 RSA就是他
  • Qt使用UDp通信、套接字socket的成员函数bind()的作用

    一 所谓bind 就是指绑定本地接受端口 指定ip 是为了分辨多ip主机 在有服务端和客户端的UDP中 bind是服务端调用的函数 绑定的是服务端的IP 假设服务端有多个网卡 即会有多个IP 这个时候我们可以选择用bind绑定其中一个IP
  • 【AntDB数据库】AntDB数据库整体架构

    整体架构 AntDB包括计算节点 Coordinator 数据节点 DB 全局事务管理器 GTM 和管理节点四种组件 其中GTM和DB为有状态的组件 需要考虑高可用 架构如下图 计算节点 Coordinator 提供SQL解析 优化 路由
  • 软体机器人接触压力分析

    背景介绍 机器人技术广泛用于工业生产 勘探勘测 医疗服务 军事侦察等领域 对于国民经济和国防建设具有重要意义 传统刚体机器人主要由硬质基体 金属 塑料等 和刚性运动副构成 能够快速 精确地完成工作任务 但这种传统的机器人运动灵活性有限 环境
  • [课程设计]Java实现图形化窗口界面可存储ATM机(自助取款机)

    很久以前写的了 没想到这么多浏览了 现在看着不是一般的乱 当时刚学java 望见谅 不过现在也没有闲工夫重写和心情修改了 凑活凑活吧 这是一个使用io流和swing库制作的可存储的窗口化ATM机程序 臭不要脸的发上来 实现的功能有 1 登录