JTable 僅負責視圖渲染與交互,數據與業務規則完全委託給 TableModel。繼承 AbstractTableModel 只需實現核心方法,即可獲得排序、過濾、編輯等豐富功能。
import javax.swing.table.AbstractTableModel;
import java.util.*;
class MyTableModel extends AbstractTableModel {
// 列定義
private final String[] columns = {"姓名", "性別", "學歷", "年齡", "是否已婚"};
// 數據存儲:二維 Object 陣列
private final Object[][] data = {
{"張三", "男", "大本", 25, false},
{"李四", "男", "大本", 33, true},
{"王五", "男", "高中", 20, false},
{"趙倩", "女", "大專", 26, true},
{"周大", "男", "大本", 24, false}
};
@Override public int getColumnCount() { return columns.length; }
@Override public int getRowCount() { return data.length; }
@Override public String getColumnName(int col) { return columns[col]; }
@Override public Object getValueAt(int row, int col) { return data[row][col]; }
// 關鍵:根據值類型自動選擇渲染器/編輯器
@Override
public Class> getColumnClass(int col) {
return getValueAt(0, col).getClass(); // 第 0 行代表該列類型
}
// 業務規則:前兩列(姓名、性別)不可編輯
@Override
public boolean isCellEditable(int row, int col) {
return col >= 2; // 學歷、年齡、是否已婚 可編輯
}
// 數據回寫:實際項目中應更新數據庫/緩存
@Override
public void setValueAt(Object value, int row, int col) {
System.out.printf("修改 [%d,%d] = %s%n", row, col, value);
data[row][col] = value;
fireTableCellUpdated(row, col); // 通知視圖刷新該單元格
}
}
import javax.swing.*;
import java.awt.*;
public class MyTableDemo extends JFrame {
public MyTableDemo() {
super("MyTableDemo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
JTable table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 150));
table.setFillsViewportHeight(true);
// 啟用列排序(點擊表頭)
table.setAutoCreateRowSorter(true);
add(new JScrollPane(table), BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(MyTableDemo::new);
}
}
| 方法 | 作用 | 本例體現 |
|---|---|---|
getColumnClass | 決定默認渲染器/編輯器 | Boolean → JCheckBox;Integer → 右對齊文本框 |
isCellEditable | 細粒度控制單元格可編輯性 | 前兩列只讀,後三列可編輯 |
setValueAt | 編輯提交後回寫模型 | 打印日誌 + 更新數組 + 觸發事件 |
fireTableCellUpdated | 通知視圖局部刷新 | 避免全表重繪,性能最優 |
setAutoCreateRowSorter | 一鍵啟用點擊表頭排序 | 無需額外代碼支持多列排序 |
getRowCount() 返回總數,getValueAt 按需從數據庫分頁加載setCellEditor 注入 JComboBox(學歷下拉)、JSpinner(年齡數字)、JDatePickerDefaultTableCellRenderer,在 getTableCellRendererComponent 中按業務邏輯着色UndoManager 在 setValueAt 記錄舊值JavaFX TableView 採用 ObservableList<T> + TableColumn<T, S> 強類型列定義,配合 cellValueFactory 與 cellFactory 實現編輯與渲染,編譯期類型安全,推薦新項目採用。