You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing银行应用:如何创建关联选定银行的详情编辑窗口?

我来帮你搞定这个问题!其实核心思路就是把选中的银行对象传递给新窗口,同时复用UI逻辑保证两个窗口的风格一致。下面给你一套完整的可运行示例代码,包含所有你需要的功能,直接就能参考调试~

实现核心思路拆解
  • 先定义Bank和Customer实体类,用来存储业务数据
  • 主窗口展示银行列表,点击按钮时获取选中的银行,传入新建的客户管理窗口
  • 提取通用的UI初始化逻辑,确保两个窗口的样式、布局保持统一
  • 客户管理窗口直接操作关联的Bank对象,实现客户的增删改功能

1. 实体类定义(Bank & Customer)

先写基础的数据模型,包含必要的属性和操作方法:

import java.util.ArrayList;
import java.util.List;

// 银行实体类
class Bank {
    private String name;
    private List<Customer> customers;

    public Bank(String name) {
        this.name = name;
        this.customers = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public List<Customer> getCustomers() {
        return customers;
    }

    public void addCustomer(Customer customer) {
        customers.add(customer);
    }

    public void removeCustomer(Customer customer) {
        customers.remove(customer);
    }

    @Override
    public String toString() {
        return name;
    }
}

// 客户实体类
class Customer {
    private String id;
    private String name;
    private String email;

    public Customer(String id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    // Getter & Setter方法
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    @Override
    public String toString() {
        return name + " (" + id + ")";
    }
}

2. 主窗口(银行选择窗口)

这个窗口展示银行列表,点击「Bank Details」按钮打开对应的客户管理窗口:

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

public class BankSelectionFrame extends JFrame {
    private JList<Bank> bankList;
    private DefaultListModel<Bank> bankListModel;

    public BankSelectionFrame() {
        initUI();
        populateSampleData();
    }

    // 通用UI初始化,保证风格统一
    private void initUI() {
        setTitle("Bank Management System");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null); // 窗口居中显示

        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        // 银行列表组件
        bankListModel = new DefaultListModel<>();
        bankList = new JList<>(bankListModel);
        bankList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        bankList.setVisibleRowCount(8);
        JScrollPane scrollPane = new JScrollPane(bankList);

        // 详情按钮
        JButton viewDetailsBtn = new JButton("Bank Details");
        viewDetailsBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Bank selectedBank = bankList.getSelectedValue();
                if (selectedBank != null) {
                    // 打开客户管理窗口,传入选中的银行对象
                    new CustomerManagementFrame(selectedBank);
                } else {
                    JOptionPane.showMessageDialog(null, "Please select a bank first!", "Warning", JOptionPane.WARNING_MESSAGE);
                }
            }
        });

        // 组装布局
        mainPanel.add(new JLabel("Select a Bank:"), BorderLayout.NORTH);
        mainPanel.add(scrollPane, BorderLayout.CENTER);
        mainPanel.add(viewDetailsBtn, BorderLayout.SOUTH);

        add(mainPanel);
        setVisible(true);
    }

    // 填充测试数据
    private void populateSampleData() {
        bankListModel.addElement(new Bank("Chase Bank"));
        bankListModel.addElement(new Bank("Wells Fargo"));
        bankListModel.addElement(new Bank("Bank of America"));
    }

    public static void main(String[] args) {
        // Swing组件必须在事件调度线程中运行
        SwingUtilities.invokeLater(() -> new BankSelectionFrame());
    }
}

3. 客户管理窗口(与指定银行关联)

这个窗口和主窗口风格一致,实现客户的增删改操作:

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

public class CustomerManagementFrame extends JFrame {
    private Bank associatedBank;
    private JList<Customer> customerList;
    private DefaultListModel<Customer> customerListModel;
    private JTextField idField, nameField, emailField;

    public CustomerManagementFrame(Bank bank) {
        this.associatedBank = bank;
        initUI();
        populateCustomerList();
    }

    // 复用相同的UI初始化逻辑,保证样式统一
    private void initUI() {
        setTitle("Customer Management - " + associatedBank.getName());
        setSize(500, 400);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // 关闭此窗口不退出整个应用
        setLocationRelativeTo(null);

        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        // 客户列表区域
        customerListModel = new DefaultListModel<>();
        customerList = new JList<>(customerListModel);
        customerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        JScrollPane listScrollPane = new JScrollPane(customerList);

        // 客户信息表单
        JPanel formPanel = new JPanel(new GridLayout(4, 2, 5, 5));
        formPanel.add(new JLabel("Customer ID:"));
        idField = new JTextField();
        formPanel.add(idField);
        formPanel.add(new JLabel("Name:"));
        nameField = new JTextField();
        formPanel.add(nameField);
        formPanel.add(new JLabel("Email:"));
        emailField = new JTextField();
        formPanel.add(emailField);

        // 操作按钮区域
        JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
        JButton addBtn = new JButton("Add Customer");
        JButton editBtn = new JButton("Edit Customer");
        JButton deleteBtn = new JButton("Delete Customer");

        // 绑定按钮事件
        addBtn.addActionListener(e -> addCustomer());
        editBtn.addActionListener(e -> editCustomer());
        deleteBtn.addActionListener(e -> deleteCustomer());

        btnPanel.add(addBtn);
        btnPanel.add(editBtn);
        btnPanel.add(deleteBtn);

        // 组装布局
        mainPanel.add(new JLabel("Customers of " + associatedBank.getName()), BorderLayout.NORTH);
        mainPanel.add(listScrollPane, BorderLayout.CENTER);
        mainPanel.add(formPanel, BorderLayout.EAST);
        mainPanel.add(btnPanel, BorderLayout.SOUTH);

        add(mainPanel);
        setVisible(true);
    }

    // 填充客户列表数据
    private void populateCustomerList() {
        customerListModel.clear();
        for (Customer c : associatedBank.getCustomers()) {
            customerListModel.addElement(c);
        }
    }

    // 添加客户逻辑
    private void addCustomer() {
        String id = idField.getText().trim();
        String name = nameField.getText().trim();
        String email = emailField.getText().trim();

        if (!id.isEmpty() && !name.isEmpty() && !email.isEmpty()) {
            associatedBank.addCustomer(new Customer(id, name, email));
            populateCustomerList();
            clearForm();
        } else {
            JOptionPane.showMessageDialog(null, "Please fill all fields!", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    // 编辑客户逻辑
    private void editCustomer() {
        Customer selected = customerList.getSelectedValue();
        if (selected != null) {
            String id = idField.getText().trim();
            String name = nameField.getText().trim();
            String email = emailField.getText().trim();

            if (!id.isEmpty() && !name.isEmpty() && !email.isEmpty()) {
                selected.setId(id);
                selected.setName(name);
                selected.setEmail(email);
                populateCustomerList();
                clearForm();
            } else {
                JOptionPane.showMessageDialog(null, "Please fill all fields!", "Error", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Select a customer to edit!", "Warning", JOptionPane.WARNING_MESSAGE);
        }
    }

    // 删除客户逻辑
    private void deleteCustomer() {
        Customer selected = customerList.getSelectedValue();
        if (selected != null) {
            int confirm = JOptionPane.showConfirmDialog(null, "Are you sure to delete this customer?", "Confirm", JOptionPane.YES_NO_OPTION);
            if (confirm == JOptionPane.YES_OPTION) {
                associatedBank.removeCustomer(selected);
                populateCustomerList();
                clearForm();
            }
        } else {
            JOptionPane.showMessageDialog(null, "Select a customer to delete!", "Warning", JOptionPane.WARNING_MESSAGE);
        }
    }

    // 清空表单输入
    private void clearForm() {
        idField.setText("");
        nameField.setText("");
        emailField.setText("");
    }
}

关键细节说明
  • 数据传递:通过构造函数把选中的Bank对象传给客户管理窗口,新窗口直接操作该银行的客户列表,数据是实时同步的
  • 样式统一:两个窗口复用了相同的布局、边框、间距设置,你可以把这些通用UI代码抽成工具类,后续修改样式更高效
  • 窗口行为:客户窗口用DISPOSE_ON_CLOSE,关闭它不会退出整个应用,只会销毁当前窗口
  • 线程安全:Swing组件必须在事件调度线程中创建,所以主方法里用了SwingUtilities.invokeLater

内容的提问来源于stack exchange,提问作者crazy_balance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:39:19