农业银行模拟器,jar代码教学演示版!!!

简介: 兄弟们,今天来点硬核的!最近在学Java Swing和面向对象,突发奇想——能不能用代码模拟一个银行系统?说干就干!熬了两个通宵

文件下载地址:https://pan38.com/xiazai/index.php?id=23 提取码:7481

兄弟们,今天来点硬核的!最近在学Java Swing和面向对象,突发奇想——能不能用代码模拟一个银行系统?说干就干!熬了两个通宵,终于搞出了这个农业银行模拟器(教学演示版)!

image.png

⚠️ 重要声明:本项目仅供编程学习,模拟银行业务流程,请勿用于实际环境!

🎮 功能亮点
🏦 完整的银行系统界面(Java Swing实现)

👤 用户登录/注册/销户

💰 存款、取款、转账功能

📊 交易记录查询

🎨 农行经典绿色主题UI

📦 项目结构
text
AgriculturalBankSimulator/
├── src/
│ ├── BankAccount.java # 账户类
│ ├── BankSystem.java # 银行系统核心逻辑
│ ├── BankGUI.java # 图形界面
│ └── Main.java # 程序入口
└── README.md
💻 核心代码展示

  1. 账户实体类(BankAccount.java)
    java
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Date;

/**

  • 银行账户类 - 核心数据模型
  • 教学重点:封装、序列化、集合的使用
    */
    public class BankAccount implements Serializable {
    private String accountNumber; // 账号
    private String password; // 密码
    private String accountHolder; // 持卡人
    private double balance; // 余额
    private Date openDate; // 开户日期
    private ArrayList transactionHistory; // 交易记录

    // 构造函数
    public BankAccount(String accountHolder, String password, double initialDeposit) {

     this.accountNumber = generateAccountNumber();
     this.accountHolder = accountHolder;
     this.password = password;
     this.balance = initialDeposit;
     this.openDate = new Date();
     this.transactionHistory = new ArrayList<>();
     this.addTransaction("账户开户,初始存款:" + initialDeposit);
    

    }

    // 生成账号(模拟)
    private String generateAccountNumber() {

     return "622848" + String.format("%010d", (long)(Math.random() * 10000000000L));
    

    }

    // 存款方法
    public boolean deposit(double amount) {

     if (amount <= 0) return false;
     balance += amount;
     addTransaction("存款:" + amount + ",余额:" + balance);
     return true;
    

    }

    // 取款方法
    public boolean withdraw(double amount) {

     if (amount <= 0 || amount > balance) return false;
     balance -= amount;
     addTransaction("取款:" + amount + ",余额:" + balance);
     return true;
    

    }

    // 转账方法
    public boolean transfer(BankAccount target, double amount) {

     if (withdraw(amount)) {
         target.deposit(amount);
         addTransaction("向账户" + target.getAccountNumber() + "转账:" + amount);
         return true;
     }
     return false;
    

    }

    // 添加交易记录
    private void addTransaction(String record) {

     String timeStamp = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
     transactionHistory.add(timeStamp + " - " + record);
    

    }

    // Getter方法
    public String getAccountNumber() { return accountNumber; }
    public double getBalance() { return balance; }
    public ArrayList getTransactionHistory() { return transactionHistory; }

    // 验证密码
    public boolean verifyPassword(String inputPassword) {

     return this.password.equals(inputPassword);
    

    }
    }

    1. 银行系统核心(BankSystem.java)
      java
      import java.util.HashMap;
      import java.util.Map;

/**

  • 银行系统核心类
  • 教学重点:单例模式、集合操作、业务逻辑封装
    */
    public class BankSystem {
    private static BankSystem instance;
    private Map accounts;
    private BankAccount currentUser;

    // 单例模式确保只有一个银行系统实例
    public static BankSystem getInstance() {

     if (instance == null) {
         instance = new BankSystem();
     }
     return instance;
    

    }

    private BankSystem() {

     accounts = new HashMap<>();
     // 添加几个演示账户
     registerAccount("张三", "123456", 5000);
     registerAccount("李四", "654321", 3000);
    

    }

    // 用户注册
    public boolean registerAccount(String name, String password, double initialDeposit) {

     if (initialDeposit < 50) {  // 最低开户金额
         return false;
     }
    
     BankAccount newAccount = new BankAccount(name, password, initialDeposit);
     accounts.put(newAccount.getAccountNumber(), newAccount);
     return true;
    

    }

    // 用户登录
    public boolean login(String accountNumber, String password) {

     BankAccount account = accounts.get(accountNumber);
     if (account != null && account.verifyPassword(password)) {
         currentUser = account;
         return true;
     }
     return false;
    

    }

    // 获取当前用户
    public BankAccount getCurrentUser() {

     return currentUser;
    

    }

    // 转账业务
    public boolean transfer(String targetAccountNumber, double amount) {

     if (currentUser == null) return false;
    
     BankAccount target = accounts.get(targetAccountNumber);
     if (target == null || target == currentUser) return false;
    
     return currentUser.transfer(target, amount);
    

    }

    // 查询账户是否存在
    public boolean accountExists(String accountNumber) {

     return accounts.containsKey(accountNumber);
    

    }
    }

    1. 图形界面(BankGUI.java)
      java
      import javax.swing.;
      import java.awt.
      ;
      import java.awt.event.ActionEvent;

/**

  • 银行系统图形界面
  • 教学重点:Swing组件、事件监听、布局管理
    */
    public class BankGUI extends JFrame {
    private BankSystem bankSystem;
    private JPanel cardPanel;
    private CardLayout cardLayout;

    // 颜色主题(农行绿)
    private final Color ABC_GREEN = new Color(0, 102, 0);
    private final Color LIGHT_BG = new Color(240, 255, 240);

    public BankGUI() {

     bankSystem = BankSystem.getInstance();
     initUI();
    

    }

    private void initUI() {

     setTitle("农业银行模拟系统 - 教学演示版");
     setSize(800, 600);
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     setLocationRelativeTo(null);
    
     // 设置农行主题
     getContentPane().setBackground(LIGHT_BG);
    
     // 主卡片布局,用于页面切换
     cardLayout = new CardLayout();
     cardPanel = new JPanel(cardLayout);
    
     // 添加各个页面
     cardPanel.add(createLoginPanel(), "login");
     cardPanel.add(createMainPanel(), "main");
     cardPanel.add(createRegisterPanel(), "register");
    
     add(cardPanel);
     cardLayout.show(cardPanel, "login");
    

    }

    // 创建登录面板
    private JPanel createLoginPanel() {

     JPanel panel = new JPanel(new GridBagLayout());
     panel.setBackground(LIGHT_BG);
     GridBagConstraints gbc = new GridBagConstraints();
     gbc.insets = new Insets(10, 10, 10, 10);
    
     // 标题
     JLabel titleLabel = new JLabel("农业银行模拟系统");
     titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 28));
     titleLabel.setForeground(ABC_GREEN);
     gbc.gridwidth = 2;
     gbc.gridy = 0;
     panel.add(titleLabel, gbc);
    
     // 账号输入
     gbc.gridwidth = 1;
     gbc.gridy = 1;
     gbc.gridx = 0;
     panel.add(new JLabel("账号:"), gbc);
    
     JTextField accountField = new JTextField(20);
     gbc.gridx = 1;
     panel.add(accountField, gbc);
    
     // 密码输入
     gbc.gridy = 2;
     gbc.gridx = 0;
     panel.add(new JLabel("密码:"), gbc);
    
     JPasswordField passwordField = new JPasswordField(20);
     gbc.gridx = 1;
     panel.add(passwordField, gbc);
    
     // 按钮面板
     JPanel buttonPanel = new JPanel(new FlowLayout());
     buttonPanel.setBackground(LIGHT_BG);
    
     JButton loginBtn = new JButton("登录");
     loginBtn.setBackground(ABC_GREEN);
     loginBtn.setForeground(Color.WHITE);
     loginBtn.addActionListener(e -> {
         String account = accountField.getText();
         String password = new String(passwordField.getPassword());
    
         if (bankSystem.login(account, password)) {
             cardLayout.show(cardPanel, "main");
             updateMainPanel();
         } else {
             JOptionPane.showMessageDialog(this, "登录失败!请检查账号密码");
         }
     });
    
     JButton registerBtn = new JButton("新用户注册");
     registerBtn.addActionListener(e -> cardLayout.show(cardPanel, "register"));
    
     buttonPanel.add(loginBtn);
     buttonPanel.add(registerBtn);
    
     gbc.gridy = 3;
     gbc.gridx = 0;
     gbc.gridwidth = 2;
     panel.add(buttonPanel, gbc);
    
     return panel;
    

    }

    // 创建主功能面板(存款、取款、转账等)
    private JPanel createMainPanel() {

     JPanel panel = new JPanel(new BorderLayout());
     panel.setBackground(LIGHT_BG);
    
     // 顶部信息栏
     JPanel topPanel = new JPanel(new BorderLayout());
     topPanel.setBackground(ABC_GREEN);
     topPanel.setPreferredSize(new Dimension(800, 60));
    
     JLabel welcomeLabel = new JLabel("欢迎使用农业银行系统");
     welcomeLabel.setForeground(Color.WHITE);
     welcomeLabel.setFont(new Font("微软雅黑", Font.BOLD, 20));
     welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);
     topPanel.add(welcomeLabel, BorderLayout.CENTER);
    
     // 功能按钮区
     JPanel functionPanel = createFunctionPanel();
    
     panel.add(topPanel, BorderLayout.NORTH);
     panel.add(functionPanel, BorderLayout.CENTER);
    
     return panel;
    

    }

    // 创建功能按钮面板
    private JPanel createFunctionPanel() {

     JPanel panel = new JPanel(new GridLayout(3, 2, 20, 20));
     panel.setBorder(BorderFactory.createEmptyBorder(40, 40, 40, 40));
     panel.setBackground(LIGHT_BG);
    
     String[] functions = {"存款", "取款", "转账", "查询余额", "交易记录", "退出登录"};
    
     for (String func : functions) {
         JButton btn = new JButton(func);
         btn.setFont(new Font("微软雅黑", Font.PLAIN, 16));
         btn.setBackground(ABC_GREEN);
         btn.setForeground(Color.WHITE);
         btn.setFocusPainted(false);
    
         // 为每个按钮添加功能
         btn.addActionListener(this::handleFunction);
    
         panel.add(btn);
     }
    
     return panel;
    

    }

    // 处理功能按钮点击
    private void handleFunction(ActionEvent e) {

     String command = ((JButton)e.getSource()).getText();
     BankAccount currentUser = bankSystem.getCurrentUser();
    
     switch (command) {
         case "存款":
             String depositAmount = JOptionPane.showInputDialog("请输入存款金额:");
             if (depositAmount != null) {
                 try {
                     double amount = Double.parseDouble(depositAmount);
                     if (currentUser.deposit(amount)) {
                         JOptionPane.showMessageDialog(this, "存款成功!");
                     } else {
                         JOptionPane.showMessageDialog(this, "存款失败!");
                     }
                 } catch (NumberFormatException ex) {
                     JOptionPane.showMessageDialog(this, "请输入有效金额!");
                 }
             }
             break;
    
         case "取款":
             String withdrawAmount = JOptionPane.showInputDialog("请输入取款金额:");
             if (withdrawAmount != null) {
                 try {
                     double amount = Double.parseDouble(withdrawAmount);
                     if (currentUser.withdraw(amount)) {
                         JOptionPane.showMessageDialog(this, "取款成功!");
                     } else {
                         JOptionPane.showMessageDialog(this, "取款失败!余额不足或金额无效");
                     }
                 } catch (NumberFormatException ex) {
                     JOptionPane.showMessageDialog(this, "请输入有效金额!");
                 }
             }
             break;
    
         case "转账":
             String targetAccount = JOptionPane.showInputDialog("请输入对方账号:");
             if (targetAccount != null && bankSystem.accountExists(targetAccount)) {
                 String transferAmount = JOptionPane.showInputDialog("请输入转账金额:");
                 try {
                     double amount = Double.parseDouble(transferAmount);
                     if (bankSystem.transfer(targetAccount, amount)) {
                         JOptionPane.showMessageDialog(this, "转账成功!");
                     } else {
                         JOptionPane.showMessageDialog(this, "转账失败!");
                     }
                 } catch (NumberFormatException ex) {
                     JOptionPane.showMessageDialog(this, "请输入有效金额!");
                 }
             } else {
                 JOptionPane.showMessageDialog(this, "账户不存在!");
             }
             break;
    
         case "查询余额":
             JOptionPane.showMessageDialog(this, 
                 "当前余额: " + currentUser.getBalance() + "元\n" +
                 "账号: " + currentUser.getAccountNumber());
             break;
    
         case "交易记录":
             showTransactionHistory(currentUser);
             break;
    
         case "退出登录":
             cardLayout.show(cardPanel, "login");
             break;
     }
    

    }

    // 显示交易记录
    private void showTransactionHistory(BankAccount account) {

     JTextArea textArea = new JTextArea(15, 40);
     textArea.setEditable(false);
     textArea.setFont(new Font("宋体", Font.PLAIN, 12));
    
     StringBuilder history = new StringBuilder("交易记录:\n");
     for (String record : account.getTransactionHistory()) {
         history.append(record).append("\n");
     }
    
     textArea.setText(history.toString());
     JScrollPane scrollPane = new JScrollPane(textArea);
    
     JOptionPane.showMessageDialog(this, scrollPane, "交易记录", 
         JOptionPane.INFORMATION_MESSAGE);
    

    }

    // 更新主面板信息
    private void updateMainPanel() {

     // 更新用户信息显示
     // 这里可以添加更新UI的逻辑
    

    }

    // 创建注册面板(代码类似,限于篇幅省略)
    private JPanel createRegisterPanel() {

     // 注册界面实现代码
     return new JPanel();
    

    }
    }

    1. 主程序入口(Main.java)
      java
      /**
  • 程序主入口
  • 教学重点:Swing线程安全
    */
    public class Main {
    public static void main(String[] args) {
     // 在事件分发线程中启动GUI
     SwingUtilities.invokeLater(() -> {
         BankGUI bankGUI = new BankGUI();
         bankGUI.setVisible(true);
     });
    
    }
    }
    🚀 如何运行
    方法1:命令行编译运行
    bash

    编译所有Java文件

    javac -encoding UTF-8 *.java

运行程序

java Main
方法2:打包成JAR运行
bash

创建清单文件 MANIFEST.MF

内容:Main-Class: Main

打包

jar cvfm AgriculturalBankSimulator.jar MANIFEST.MF *.class

运行JAR

java -jar AgriculturalBankSimulator.jar
📚 教学重点总结

  1. 面向对象设计
    实体类封装(BankAccount)

单例模式应用(BankSystem)

职责分离原则

  1. Swing图形编程
    容器布局管理(CardLayout、GridBagLayout)

事件处理机制

自定义UI主题

  1. 数据持久化
    使用Serializable接口

集合框架的应用

交易记录管理

  1. 业务逻辑实现
    银行核心业务流程

异常处理和输入验证

用户会话管理

🔧 扩展建议(课后作业)
增加数据库支持:用SQLite存储账户数据

添加利息计算:实现定期存款和利息计算

网络功能:用Socket实现多客户端连接

加密功能:对密码进行MD5或SHA加密

报表生成:导出交易记录为Excel

相关文章
|
10天前
|
数据采集 人工智能 安全
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
316 164
|
4天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
322 155
|
5天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
369 4
|
13天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
906 7

热门文章

最新文章