首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java JTable 刪除選中行並同步資料庫完整實作

     編輯:程式設計綜合問答

核心流程

  1. 取得 JTable 選中行索引
  2. 從 TableModel 取得該行主鍵值
  3. 執行資料庫 DELETE
  4. 成功後從 TableModel 移除行

完整實作

// UserInfo 實體類 (Getter/Setter 省略)
public class UserInfo {
    private String userAccount; // 主鍵
    private String userName;
    private String nickName;
    // ... 其他欄位
    // 建構子、Getter、Setter、toString()
}

// DAO 層
public class UserDAO {
    public boolean deleteByAccount(String account) {
        String sql = "DELETE FROM t_UserInfo WHERE USERACCOUNT = ?";
        try (Connection conn = BaseDAO.getConnection();
             PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setString(1, account);
            return ps.executeUpdate() > 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
}

// UI 事件處理
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    int selectedRow = jTable.getSelectedRow();
    if (selectedRow == -1) {
        JOptionPane.showMessageDialog(this, "請先選擇要刪除的行");
        return;
    }
    
    // 確認對話框
    int confirm = JOptionPane.showConfirmDialog(this, 
        "確定刪除選中的用戶嗎?", "確認刪除", JOptionPane.YES_NO_OPTION);
    if (confirm != JOptionPane.YES_OPTION) return;
    
    // 從 Model 取得主鍵 (假設第 0 欄是 USERACCOUNT)
    String account = (String) tableModel.getValueAt(selectedRow, 0);
    
    // 執行刪除
    UserDAO dao = new UserDAO();
    if (dao.deleteByAccount(account)) {
        // 資料庫成功,移除 TableModel 行
        tableModel.removeRow(selectedRow);
        JOptionPane.showMessageDialog(this, "刪除成功");
    } else {
        JOptionPane.showMessageDialog(this, "刪除失敗,請檢查日誌");
    }
}

關鍵點解析

步驟代碼說明
取得選中行`jTable.getSelectedRow()`回傳視圖索引,-1 表示無選取
轉換為模型索引`jTable.convertRowIndexToModel(viewRow)`若有排序/過濾必須轉換
取得主鍵值`tableModel.getValueAt(modelRow, 0)`第 0 欄對應 USERACCOUNT
移除模型行`tableModel.removeRow(modelRow)`DefaultTableModel 方法

進階:支援多行刪除

int[] selectedRows = jTable.getSelectedRows();
if (selectedRows.length == 0) return;

// 由大到小刪除避免索引位移
Arrays.sort(selectedRows);
for (int i = selectedRows.length - 1; i >= 0; i--) {
    int viewRow = selectedRows[i];
    int modelRow = jTable.convertRowIndexToModel(viewRow);
    String account = (String) tableModel.getValueAt(modelRow, 0);
    if (dao.deleteByAccount(account)) {
        tableModel.removeRow(modelRow);
    }
}

最佳實踐建議

  1. 主鍵隱藏欄:JTable 不顯示主鍵欄,但 Model 保留,tableModel.setColumnIdentifiers() 設定顯示欄位
  2. 事務處理:批次刪除時使用資料庫事務
  3. 軟刪除:考慮 `UPDATE ... SET deleted=1` 替代物理刪除
  4. 異步執行:大量刪除用 `SwingWorker` 避免凍結 UI
  5. 權限控制:刪除前檢查當前用戶權限
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved