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

Java Swing JTable 完整進階指南:基本用法、列點擊事件、自訂儲存格物件、動態增刪列

     編輯:Java 相關知識

1. 基本用法:Vector 動態建模

JTable 採用 TableModel 分離資料與視圖。最直觀的方式是使用 DefaultTableModel 搭配 Vector:

String[] columns = {"時間", "編號", "金額", "操作員"};
Vector> data = new Vector<>();

// 假設從 List 取得資料
for (Order o : orderList) {
    Vector row = new Vector<>();
    row.add(o.getTime());
    row.add(new CellWrapper(o.getId(), o.getNo(), o)); // 自訂物件
    row.add(o.getTotal());
    row.add(o.getUser());
    data.add(row);
}

DefaultTableModel model = new DefaultTableModel(data, new Vector<>(Arrays.asList(columns))) {
    @Override public boolean isCellEditable(int r, int c) { return c == 3; } // 僅第 4 欄可編輯
};
table.setModel(model);


2. 列點擊/雙擊事件

於設計檢視為 JTable 加入 mouseClicked 事件:

private void tableMouseClicked(MouseEvent evt) {
    if (evt.getClickCount() >= 2) {
        int row = table.rowAtPoint(evt.getPoint());
        int col = findIdentifierColumn(table); // 找含 ID 的欄位
        if (col == -1) return;
        CellWrapper cell = (CellWrapper) table.getValueAt(row, col);
        String id = cell.getId();
        new DetailDialog(id).setVisible(true);
    }
}

3. 自訂儲存格物件(攜帶 ID 與完整物件)

public class CellWrapper {
    private String text = "", id = "";
    private Object customObj;

    public CellWrapper() {}
    public CellWrapper(String t) { this.text = t; }
    public CellWrapper(String id, String t) { this.id = id; this.text = t; }
    public CellWrapper(String id, String t, Object obj) { this(id, t); this.customObj = obj; }

    // getter/setter 略...

    @Override public String toString() { return text; } // JTable 顯示用
}

優點:toString() 決定顯示內容,getId()/getCustomObj() 攜帶業務鍵與完整物件,點擊事件中直接取出,無需額外映射。

4. 動態新增/更新列

DefaultTableModel m = (DefaultTableModel) table.getModel();
// 新增
m.addRow(new Object[]{time, new CellWrapper(id, no, order), total, user});

// 或:檢查是否已存在相同 ID,存在則更新數量
for (int i = 0; i < m.getRowCount(); i++) {
    CellWrapper c = (CellWrapper) m.getValueAt(i, ID_COL);
    if (c.getId().equals(newId)) {
        int qty = (Integer) m.getValueAt(i, QTY_COL) + 1;
        m.setValueAt(qty, i, QTY_COL);
        return;
    }
}
m.addRow(...); // 不存在則新增

進階技巧

  • 渲染器:實作 TableCellRenderer 自訂顏色、圖示、進度條等。
  • 編輯器:實作 TableCellEditor 支援下拉選單、日期選擇器等。
  • 排序/過濾:TableRowSorter 配合 RowFilter。
  • 大量資料:實作 AbstractTableModel 按需載入,避免一次性載入所有資料到 Vector。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved