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

Java Swing表格存入ArrayList异常:Person属性赋值错误排查

解决Swing表格新增Person记录时lastname被错误赋值为name的问题

看起来你遇到的是典型的数据映射错误——把表格第二列的内容错误绑定到了Person的name属性,而非lastname。我帮你梳理几个最可能的原因和对应的修复方案:

1. 检查TableModel的数据映射逻辑

Swing表格的TableModel是UI和数据的核心连接层,最容易在这里出问题。如果你用了自定义AbstractTableModel,重点检查这两个方法:

错误示例(问题根源):

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Person person = personList.get(rowIndex);
    // 错误:两列都返回name属性
    if (columnIndex == 0 || columnIndex == 1) {
        return person.name;
    }
    return null;
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Person person = personList.get(rowIndex);
    // 错误:两列都设置name属性
    if (columnIndex == 0 || columnIndex == 1) {
        person.name = aValue.toString();
    }
    fireTableCellUpdated(rowIndex, columnIndex);
}

修复后的正确逻辑:

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Person person = personList.get(rowIndex);
    switch (columnIndex) {
        case 0: return person.name;
        case 1: return person.lastname; // 第二列正确返回lastname
        default: return null;
    }
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Person person = personList.get(rowIndex);
    String value = aValue.toString();
    switch (columnIndex) {
        case 0: person.name = value;
                break;
        case 1: person.lastname = value; // 第二列赋值给lastname
                break;
    }
    fireTableCellUpdated(rowIndex, columnIndex);
}

2. 检查新增记录时的表格数据获取代码

如果是通过按钮触发新增操作,你可能在读取表格输入时,错误地两次读取了第一列的值:

错误示例:

// 获取表格输入内容
String name = table.getValueAt(table.getRowCount()-1, 0).toString();
// 错误:重复读取第0列,应该读取第1列
String lastname = table.getValueAt(table.getRowCount()-1, 0).toString();

// 创建Person对象并添加到数据库
Person newPerson = new Person(name, lastname);
personDatabase.addPerson(newPerson);

修复后:

String name = table.getValueAt(table.getRowCount()-1, 0).toString();
// 正确读取第1列作为lastname
String lastname = table.getValueAt(table.getRowCount()-1, 1).toString();

Person newPerson = new Person(name, lastname);
personDatabase.addPerson(newPerson);

3. 检查Person类的构造方法/Setter方法

最后排查Person类本身,有没有在赋值时搞混属性:

错误示例:

public Person(String name, String lastname) {
    // 错误:把lastname重复赋值给name
    this.name = name;
    this.name = lastname;
}

// 或者Setter方法出错
public void setLastname(String lastname) {
    this.name = lastname; // 应该是this.lastname = lastname
}

修复后:

public Person(String name, String lastname) {
    this.name = name;
    this.lastname = lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

先从这三个方向排查,尤其是TableModel的逻辑——这是Swing表格数据绑定最容易踩坑的地方。如果还有问题,可以把相关的TableModel和新增记录的代码贴出来,我再帮你细化分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:33:28