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

Swing 表格實戰:自定義 TableModel 實現分列編輯控制與數據封裝

     編輯:Java 程式設計入門

架構解耦:JTable + TableModel

JTable 僅負責視圖渲染與交互,數據與業務規則完全委託給 TableModel。繼承 AbstractTableModel 只需實現核心方法,即可獲得排序、過濾、編輯等豐富功能。

自定義模型:MyTableModel

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); // 通知視圖刷新該單元格
    }
}

主程序裝配:MyTableDemo

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(年齡數字)、JDatePicker
  • 行級顏色/字體:自定義 DefaultTableCellRenderer,在 getTableCellRendererComponent 中按業務邏輯着色
  • 撤銷/重做:結合 UndoManager 在 setValueAt 記錄舊值
  • 導出 Excel/CSV:遍歷模型數據寫入 Apache POI / OpenCSV

遷移提示

JavaFX TableView 採用 ObservableList<T> + TableColumn<T, S> 強類型列定義,配合 cellValueFactory 與 cellFactory 實現編輯與渲染,編譯期類型安全,推薦新項目採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved