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

