为什么Java Swing中JTable修改列值后按回车数据不更新?
问题原因与解决方案
核心问题1:未实现setValueAt()方法
AbstractTableModel的默认setValueAt()是空实现,编辑完单元格按下回车后,框架会调用这个方法把新值同步到Model的底层存储rows数组中,你没有重写该方法,修改后的值自然不会被保存,视图也不会刷新。
核心问题2:单元格编辑权限未开启
你当前代码里canEdit数组所有值都为false,所有单元格默认都是不可编辑状态,如果你需要编辑指定列,要把对应列的索引位置改为true,比如l_name对应索引为2,修改canEdit[2] = true即可。
修复代码
修改TheModel类,新增setValueAt()重写方法
public class TheModel extends AbstractTableModel { private String[] columns; private Object[][] rows; private boolean[] edit; public TheModel() { } public TheModel(Object[][] data, String[] columnName, boolean[] canEdit) { this.rows = data; this.columns = columnName; this.edit = canEdit; } public Class getColumnClass(int column) { if (column == 12) { return Icon.class; } else { return getValueAt(0, column).getClass(); } } public int getRowCount() { return this.rows.length; } public int getColumnCount() { return this.columns.length; } public Object getValueAt(int rowIndex, int columnIndex) { return this.rows[rowIndex][columnIndex]; } public String getColumnName(int col) { return this.columns[col]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return edit[columnIndex]; } // 新增重写的setValueAt方法 @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { // 把新值更新到底层数组 rows[rowIndex][columnIndex] = aValue; // 通知JTable对应单元格数据已变更,刷新显示 fireTableCellUpdated(rowIndex, columnIndex); // 如果需要实时同步修改到数据库,可以在这里加JDBC更新逻辑 // 比如根据rowIndex拿到该行的emp_code,然后更新对应字段的值到数据库 } }
修改编辑权限配置
如果需要开放l_name列的编辑权限,修改canEdit数组对应位置的值:
boolean[] canEdit = new boolean[]{ false, false, true, false, false, false, false, false, false, false, false, false, false };
其他优化点
你初始化完TheModel后调用的model.fireTableDataChanged()是冗余操作,刚创建的Model直接setModel给JTable即可,不需要手动触发数据更新通知。
问题复现截图
修改前
l_name字段值为Dourcy,修改为Leach:
修改后
未修复前字段值不会更新为Leach:
内容的提问来源于stack exchange,提问作者Faheem azaz Bhanej
相关产品推荐
相关产品推荐

