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

如何向JTable添加数据并避免程序结束后数据丢失?解决新增覆盖问题

解决JTable数据覆盖与数据持久化问题

一、修复JTable只能存储单行、数据被覆盖的问题

问题根源是你每次新增数据时,可能直接替换了TableModel或者没有正确往现有模型里追加行。正确的做法是维护一个全局的DefaultTableModel实例,每次新增数据时调用addRow()方法追加,而非覆盖原有数据。

示例代码:

// 初始化TableModel,定义列名
DefaultTableModel tableModel = new DefaultTableModel(
    new Object[]{"账号", "姓名", "入职日期", "初始金额"},
    0 // 初始行数设为0
);
// 关联JTable
JTable table = new JTable(tableModel);

// 新增数据的方法
public void addData(String account, String name, LocalDate hireDate, BigDecimal initialAmount) {
    // 将数据封装为Object数组
    Object[] rowData = {
        account,
        name,
        hireDate.format(DateTimeFormatter.ISO_LOCAL_DATE), // 标准化日期格式
        initialAmount.toPlainString()
    };
    // 追加行到模型,JTable会自动更新显示
    tableModel.addRow(rowData);
}

每次调用addData()时,新数据会追加到表格末尾,不会覆盖原有内容。

二、实现程序关闭后数据不丢失(持久化)

根据数据规模和需求,推荐两种轻量级方案:

1. 用CSV文件存储数据

适合数据量不大的场景,纯文本格式易实现:

  • 保存数据到CSV:在程序关闭时触发,遍历TableModel写入文件
public void saveDataToCsv(String filePath) throws IOException {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
        // 写入列名
        writer.write("账号,姓名,入职日期,初始金额");
        writer.newLine();
        // 遍历所有行写入
        for (int i = 0; i < tableModel.getRowCount(); i++) {
            StringBuilder row = new StringBuilder();
            for (int j = 0; j < tableModel.getColumnCount(); j++) {
                row.append(tableModel.getValueAt(i, j));
                if (j != tableModel.getColumnCount() - 1) {
                    row.append(",");
                }
            }
            writer.write(row.toString());
            writer.newLine();
        }
    }
}
  • 启动时加载CSV数据:读取文件内容并添加到TableModel
public void loadDataFromCsv(String filePath) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
        String line;
        // 跳过列名行
        reader.readLine();
        while ((line = reader.readLine()) != null) {
            String[] data = line.split(",");
            if (data.length == 4) {
                tableModel.addRow(data);
            }
        }
    }
}

给窗口添加关闭监听触发保存:

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        try {
            saveDataToCsv("employee_data.csv");
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "保存数据失败:" + ex.getMessage());
        }
        System.exit(0);
    }
});

2. 用SQLite数据库存储

适合数据量较大、需要复杂查询的场景,无需额外安装数据库服务:

  • 先添加sqlite-jdbc依赖,再实现数据操作:
// 获取数据库连接
private Connection getConnection() throws SQLException {
    return DriverManager.getConnection("jdbc:sqlite:employee.db");
}

// 首次启动创建表
public void createTable() {
    String sql = "CREATE TABLE IF NOT EXISTS employees (" +
            "account TEXT PRIMARY KEY," +
            "name TEXT NOT NULL," +
            "hire_date TEXT NOT NULL," +
            "initial_amount TEXT NOT NULL)";
    try (Connection conn = getConnection();
         Statement stmt = conn.createStatement()) {
        stmt.execute(sql);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

// 保存单条数据到数据库
public void saveDataToDb(String account, String name, String hireDate, String initialAmount) {
    String sql = "INSERT OR REPLACE INTO employees(account, name, hire_date, initial_amount) VALUES(?,?,?,?)";
    try (Connection conn = getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {
        pstmt.setString(1, account);
        pstmt.setString(2, name);
        pstmt.setString(3, hireDate);
        pstmt.setString(4, initialAmount);
        pstmt.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

// 加载所有数据到TableModel
public void loadDataFromDb() {
    String sql = "SELECT * FROM employees";
    try (Connection conn = getConnection();
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
        tableModel.setRowCount(0); // 清空现有数据
        while (rs.next()) {
            Object[] row = {
                rs.getString("account"),
                rs.getString("name"),
                rs.getString("hire_date"),
                rs.getString("initial_amount")
            };
            tableModel.addRow(row);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

程序启动时调用createTable()和loadDataFromDb(),新增数据时调用saveDataToDb()即可。

内容的提问来源于stack exchange,提问作者Ajay krishnan t p

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:00:19