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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:35:34