JTable 兩大構造入口
| 構造方法 | 核心參數 | 適用場景 |
JTable(Object[][] rowData, Object[] columnNames) | 二維數組 + 列名數組 | 數據量小、一次性載入、結構固定 |
JTable(TableModel dm) | 實現 TableModel 介面的模型 | 大數據、分頁、動態更新、可編輯、排序 |
前置準備
- MyEclipse 可視化設計器拖入
JTable 控件
- 已有可用資料庫表(如
t_userr(id, username, password))
- JDBC 工具類支援
PreparedStatement 查詢返回 ResultSet
方式一:二維數組綁定 (快速原型)
1. ResultSet → Object[][] 轉換工具
public Object[][] resultSetToArray(ResultSet rs) {
try {
rs.last();
int rows = rs.getRow();
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
rs.beforeFirst();
Object[][] data = new Object[rows][cols];
int r = 0;
while (rs.next()) {
for (int c = 0; c < cols; c++) {
data[r][c] = rs.getObject(c + 1);
}
r++;
}
return data;
} catch (SQLException e) { e.printStackTrace(); return new Object[0][0]; }
}
2. 界面代碼綁定
// 獲取數據
UserDAO dao = new UserDAO();
ResultSet rs = dao.getResultSet("SELECT id, username, password FROM t_userr", null);
Object[][] data = dao.resultSetToArray(rs);
// 列名
String[] columns = {"ID", "用戶名", "密碼"};
// 設置模型
jTable1.setModel(new DefaultTableModel(data, columns));
效果圖
方式二:自定義 TableModel 綁定 (企業級推薦)
1. 可視化設計器配置 Model 來源
- 選中 JTable → 屬性面板 →
model 屬性
- 選擇「Code」來源
- 填寫靜態方法全路徑:
com.demo.table.TableModelFactory.createUserModel
2. 實現靜態工廠方法
public class TableModelFactory {
public static TableModel createUserModel() {
// 1. 查詢數據
BaseDAO dao = new BaseDAO();
String sql = "SELECT id, real_name, username, sex, phone, email, vocation, city FROM jdbc_test";
List<Map<Object, Object>> list = dao.query(sql, new Object[]{});
// 2. 轉二維數組
String[][] data = new String[list.size()][8];
for (int i = 0; i < list.size(); i++) {
Map<Object, Object> row = list.get(i);
int c = 0;
for (Object key : row.keySet()) {
data[i][c++] = row.get(key).toString();
}
}
// 3. 列名
String[] columns = {"ID", "真實姓名", "用戶名", "性別", "電話", "郵箱", "職業", "城市"};
// 4. 返回 DefaultTableModel (實現 TableModel)
return new DefaultTableModel(data, columns);
}
}
效果圖
兩種方式對比與選型
| 維度 | 二維數組 | TableModel |
| 代碼耦合度 | UI 代碼混雜查詢邏輯 | 關注點分離,Model 獨立 |
| 可視化設計器支援 | 需手動 setModel | 原生支援,屬性面板配置 |
| 數據量大 | 全量載入內存,易 OOM | 可實現分頁/虛擬化模型 |
| 單元格編輯/渲染 | DefaultTableModel 有限支援 | 完全可控,覆寫 getColumnClass/isCellEditable |
| 排序/過濾 | 需外部 TableRowSorter | 模型層原生整合 |
| 推薦場景 | 原型、小數據、固定結構 | 生產系統、複雜交互、可維護性 |
進階提示
- 大數據量必須實現
AbstractTableModel,重寫 getValueAt 按需查詢(虛擬表格)
- 可編輯表格需覆寫
isCellEditable、setValueAt 並處理持久化回寫
- Swing 非線程安全,長查詢必須放
SwingWorker 後台執行,完成後 SwingUtilities.invokeLater 更新模型