文件下载地址:https://pan38.com/xiazai/index.php?id=23 提取码:7481
兄弟们,今天来点硬核的!最近在学Java Swing和面向对象,突发奇想——能不能用代码模拟一个银行系统?说干就干!熬了两个通宵,终于搞出了这个农业银行模拟器(教学演示版)!

⚠️ 重要声明:本项目仅供编程学习,模拟银行业务流程,请勿用于实际环境!
🎮 功能亮点
🏦 完整的银行系统界面(Java Swing实现)
👤 用户登录/注册/销户
💰 存款、取款、转账功能
📊 交易记录查询
🎨 农行经典绿色主题UI
📦 项目结构
text
AgriculturalBankSimulator/
├── src/
│ ├── BankAccount.java # 账户类
│ ├── BankSystem.java # 银行系统核心逻辑
│ ├── BankGUI.java # 图形界面
│ └── Main.java # 程序入口
└── README.md
💻 核心代码展示
- 账户实体类(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);}
}- 银行系统核心(BankSystem.java)
java
import java.util.HashMap;
import java.util.Map;
- 银行系统核心(BankSystem.java)
/**
- 银行系统核心类
教学重点:单例模式、集合操作、业务逻辑封装
*/
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);}
}- 图形界面(BankGUI.java)
java
import javax.swing.;
import java.awt.;
import java.awt.event.ActionEvent;
- 图形界面(BankGUI.java)
/**
- 银行系统图形界面
教学重点: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();}
}- 主程序入口(Main.java)
java
/**
- 主程序入口(Main.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
📚 教学重点总结
- 面向对象设计
实体类封装(BankAccount)
单例模式应用(BankSystem)
职责分离原则
- Swing图形编程
容器布局管理(CardLayout、GridBagLayout)
事件处理机制
自定义UI主题
- 数据持久化
使用Serializable接口
集合框架的应用
交易记录管理
- 业务逻辑实现
银行核心业务流程
异常处理和输入验证
用户会话管理
🔧 扩展建议(课后作业)
增加数据库支持:用SQLite存储账户数据
添加利息计算:实现定期存款和利息计算
网络功能:用Socket实现多客户端连接
加密功能:对密码进行MD5或SHA加密
报表生成:导出交易记录为Excel