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
相关产品推荐
相关产品推荐

