核心流程
- 取得 JTable 選中行索引
- 從 TableModel 取得該行主鍵值
- 執行資料庫 DELETE
- 成功後從 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);
}
}
最佳實踐建議
- 主鍵隱藏欄:JTable 不顯示主鍵欄,但 Model 保留,
tableModel.setColumnIdentifiers() 設定顯示欄位
- 事務處理:批次刪除時使用資料庫事務
- 軟刪除:考慮 `UPDATE ... SET deleted=1` 替代物理刪除
- 異步執行:大量刪除用 `SwingWorker` 避免凍結 UI
- 權限控制:刪除前檢查當前用戶權限