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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:18:04