Java房产GUI开发求助:如何更新文本文件中特定租户的余额?
房产GUI程序租户余额更新问题解决
问题说明
正在开发一款房产GUI程序,用于收集租户姓名、公寓号等信息并存储至文本文件。已实现租户新增、删除与查看功能,但更新模块存在问题:
- 租户信息通过
ArrayList<Person>存储,重写toString方法逐行写入文本文件(每行对应一位租户) - 需要实现逻辑:租户缴纳款项后,将该租户的
balance更新为monthRent - deposit - 当前难点:无法读取指定租户的
monthRent和balance完成计算,虽知晓需重新生成更新后的文件,但不知如何提取特定数据
现有代码
Person类代码
public class Person extends JFrame{ File log = new File("tenantData.txt"); static ArrayList<Person> tenantData = new ArrayList<Person>(); public String firstName; public String lastName; public int apartmentNumber; public String streetAddress; public int streetNumber; public String town; public String state; public float balance; public float deposit; public float monthRent; Person( String firstName, String LastName, int apartmentNumber, String streetAddress, int streetNumber, String town, String state, float monthRent, float balance) { this.firstName = firstName; this.lastName = LastName; this.apartmentNumber = apartmentNumber; this.streetAddress = streetAddress; this.streetNumber = streetNumber; this.town = town; this.state = state; this.monthRent = monthRent; this.balance = balance; } @Override public String toString() { String str = firstName + " " + lastName + ", apartment" + apartmentNumber + ", " +streetNumber+ " " +streetAddress+ ", " +town+ ", " +state+ ". Monthly Rent: "+ monthRent+ " Balance: " + balance + "\n"; return str; } }
主类更新面板及按钮处理代码
public void buildPanel3() { JPanel panel = new JPanel(); ButtonHandler4 b = new ButtonHandler4(); label = new JLabel("Enter first and last name of tenant you would like to update"); field = new JTextField(25); label2 = new JLabel("Enter the amount that the tenant has payed"); paymentAmount = new JTextField(4); update = new JButton(updateTenant); update.addActionListener(b); panel.add(label); panel.add(field); panel.add(label2); panel.add(paymentAmount); panel.add(update); add(panel); } public class ButtonHandler4 implements ActionListener{ public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if(str.equals(updateTenant)) { String line = field.getText(); String payment = paymentAmount.getText(); String[] parts = line.split(" "); String firstName = parts[0]; String lastName = parts[1]; // 后续逻辑待补充 } } }
解决方案步骤
1. 查找目标租户
在按钮处理逻辑中,遍历tenantData集合,通过姓名匹配找到对应的租户对象(建议后续改用公寓号作为唯一标识,避免重名冲突):
// 遍历集合查找目标租户 Person targetTenant = null; for (Person tenant : Person.tenantData) { if (tenant.firstName.equals(firstName) && tenant.lastName.equals(lastName)) { targetTenant = tenant; break; } } // 检查是否找到租户 if (targetTenant == null) { // 可添加GUI提示,比如弹出对话框告知未找到该租户 return; }
2. 计算并更新余额
根据需求更新balance,同时处理输入格式异常:
try { // 按需求更新balance:monthRent - deposit targetTenant.balance = targetTenant.monthRent - targetTenant.deposit; // 如果是按缴纳金额扣除余额,替换为以下代码: // float payAmount = Float.parseFloat(payment); // targetTenant.balance -= payAmount; } catch (NumberFormatException ex) { // 输入金额格式错误,弹出GUI提示 JOptionPane.showMessageDialog(null, "请输入有效的数字金额"); return; }
3. 重新写入文本文件
更新租户信息后,将整个tenantData集合重新写入文件,覆盖原内容:
try (PrintWriter writer = new PrintWriter(new FileWriter(Person.log))) { for (Person t : Person.tenantData) { writer.print(t.toString()); } // 可添加GUI提示更新成功 JOptionPane.showMessageDialog(null, "租户信息更新成功"); } catch (IOException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null, "保存租户信息失败"); }
4. 优化建议
- 将
Person类的成员变量改为private,提供对应的getter和setter方法,符合面向对象封装原则 - 增加输入验证:检查姓名输入是否为空、是否包含非法字符,避免数组越界
- 改用公寓号作为租户唯一标识,避免重名导致的匹配错误
内容的提问来源于stack exchange,提问作者Alem Beskovic
相关产品推荐
相关产品推荐

