首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java JTable 自訂模型實戰:繼承 AbstractTableModel 實現可編輯、類型安全、資料驗證的表格元件

     編輯:Java 相關知識

深度解析 JTable 的模型-視圖分離架構,透過繼承 AbstractTableModel 實現自訂資料模型,支援列類型自動識別(布林顯示為核取方塊)、指定列可編輯控制、資料變更通知與除錯輸出,打造生產級表格元件。

核心架構:MyTableModel


class MyTableModel extends AbstractTableModel {
    // 欄位定義
    final String[] columnNames = {"姓名", "性別", "學歷", "年齡", "是否已婚"};
    // 初始資料(二維陣列)
    final Object[][] data = {
        {"張三", "男", "大學", 25, false},
        {"李四", "男", "大學", 33, true},
        {"王五", "男", "高中", 20, false},
        {"趙倩", "女", "大專", 26, true},
        {"周大", "男", "大學", 24, false}
    };
    // 必須實作的三大核心方法
    public int getColumnCount() { return columnNames.length; }
    public int getRowCount() { return data.length; }
    public Object getValueAt(int row, int col) { return data[row][col]; }
    // 進階功能覆寫
    public String getColumnName(int col) { return columnNames[col]; }
    // 關鍵:根據首行資料類型決定渲染器/編輯器(Boolean → JCheckBox)
    public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); }
    // 控制可編輯性:前兩列唯讀,其餘可編輯
    public boolean isCellEditable(int row, int col) { return col >= 2; }
    // 資料更新處理
    public void setValueAt(Object value, int row, int col) {
        System.out.println("更新: [" + row + "," + col + "] = " + value);
        data[row][col] = value;
        fireTableCellUpdated(row, col); // 通知視圖重繪該儲存格
        printDebugData(); // 除錯輸出完整表格
    }
    private void printDebugData() {
        for (int i = 0; i < getRowCount(); i++) {
            System.out.print("行 " + i + ":");
            for (int j = 0; j < getColumnCount(); j++) System.out.print(" " + data[i][j]);
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}

關鍵設計模式解析

方法作用不覆寫後果
getColumnClass()決定預設渲染器/編輯器所有儲存格用 toString() 顯示,Boolean 顯示 "true/false" 而非核取方塊
isCellEditable()控制儲存格能否編輯全部可編輯或全部不可編輯(預設 false)
setValueAt()處理編輯提交、資料驗證、觸發事件編輯無效果,資料不更新
fireTableCellUpdated()發送 TableModelEvent 通知視圖視圖不重繪,顯示舊資料

完整視窗整合


public class MyTableDemo extends JFrame {
    public MyTableDemo() {
        super("Custom Table Model Demo");
        MyTableModel model = new MyTableModel();
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack(); setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MyTableDemo());
    }
}

進階擴展方向

  1. 資料驗證:在 setValueAt() 中加入正則/範圍檢查,失敗拋出例外或恢復舊值。
  2. 自訂編輯器:table.setDefaultEditor(MyClass.class, new MyCellEditor())。
  3. 排序/過濾:包裝 TableRowSorter<MyTableModel>。
  4. 資料庫同步:setValueAt() 中呼叫 DAO 更新資料庫,失敗回滾。
  5. 大資料分頁:模型內部只緩存當前頁,翻頁時查詢資料庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved