Java+Swing实现自助取款机(ATM)系统-TXT存储数据

简介: Java+Swing实现自助取款机(ATM)系统-TXT存储数据

一、系统介绍


系统功能

1.登录系统

2.查询余额

3.取款

4.存款

5.转账

6.修改密码

7.退出系统

JDK版本:1.8

存储数据形式:TXT存储数据


二、系统展示


1.登录页


20210609230617962.jpg


2.主页


image.jpeg


3.取款


20210609230647845.jpg


4.存款


20210609230702216.jpg


5.转账


20210609230715144.jpg


6.修改密码


20210609230726561.jpg


三、部分代码


LoginJFrame.java

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();// 先创建登录界面
  }
}

CentreJFrame.java

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;
  }
}

CunMoneyJFrame.java

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("");
  }
}

GiveMoneyJFrame.java

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();// 关闭此界面
  }
}

QuMoneyJFrame.java

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("");
  }
}


四、其他


1.其他系统实现


JavaWeb系统系列实现

Java+JSP实现图书管理系统

Java+JSP实现学生信息管理系统

Java+Servlet+JSP实现学生成绩管理系统

Java+Servlet+JSP实现宠物诊所管理系统

Java+SSM+Easyui实现网上考试系统

Java+Springboot+H-ui实现营销管理系统

Java+Springboot+Mybatis+Bootstrap实现网上商城系统


JavaSwing系统系列实现

Java+Swing实现医院管理系统

Java+Swing实现仓库管理系统

Java+Swing实现学生信息管理系统

Java+Swing实现学生宿舍管理系统

Java+Swing实现学生选课管理系统

Java+Swing实现电子相册管理系统

Java+Swing实现图书管理系统

Java+Swing实现斗地主游戏

Java+Swing实现宠物商店管理系统-TXT存储信息

Java+Swing实现学生成绩管理系统

Java+Swing实现企业人事管理系统

Java+Swing实现学校教材管理系统

Java+Swing实现学校教务管理系统

Java+Swing实现超市管理系统-TXT存储信息

Java+Swing实现考试管理系统


相关文章
|
15天前
|
前端开发 JavaScript Java
java常用数据判空、比较和类型转换
本文介绍了Java开发中常见的数据处理技巧,包括数据判空、数据比较和类型转换。详细讲解了字符串、Integer、对象、List、Map、Set及数组的判空方法,推荐使用工具类如StringUtils、Objects等。同时,讨论了基本数据类型与引用数据类型的比较方法,以及自动类型转换和强制类型转换的规则。最后,提供了数值类型与字符串互相转换的具体示例。
|
29天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
10天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
20天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
22天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
24 3
|
1月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
70 2
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
30 2
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
57 2
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
下一篇
DataWorks