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

Java Swing JTable 完全指南:從基礎顯示到自定義渲染器

     編輯:Java 相關知識

簡單表格:三行代碼顯示二維資料

Object[][] data = {{"李清照",29,"女"},{"蘇格拉底",56,"男"},{"李白",35,"男"}};
Object[] cols = {"姓名","年齡","性別"};
JTable table = new JTable(data, cols);
frame.add(new JScrollPane(table));

進階控制:列寬調整模式、選擇模式、選擇單元

  • 自動調整模式:`AUTO_RESIZE_OFF`、`NEXT_COLUMN`、`SUBSEQUENT_COLUMNS`、`LAST_COLUMN`、`ALL_COLUMNS`。
  • 選擇模式:`MULTIPLE_INTERVAL_SELECTION`、`SINGLE_INTERVAL_SELECTION`、`SINGLE_SELECTION`。
  • 選擇單元:行選擇、列選擇、單元格選擇(三者互斥/組合)。

透過 `JRadioButtonMenuItem` 動態切換上述屬性,即時觀察效果。

模型驅動:DefaultTableModel 動態增刪行列

DefaultTableModel model = new DefaultTableModel(COLUMN_COUNT, COLUMN_COUNT);
JTable table = new JTable(model);

// 新增行
model.addRow(new Object[]{"新值1","新值2",...});

// 刪除選中行
for (int i : table.getSelectedRows()) model.removeRow(i);

// 隱藏/顯示列(操作 TableColumnModel)
table.removeColumn(column); // 隱藏
table.addColumn(column);    // 顯示(原列對象)
注意:`addColumn` 僅重新顯示已隱藏列,真正新增列需重建 JTable。

自定義單元格渲染器:讓「男/女」顯示為圖標

步驟 1:自定義 TableModel 回傳真實類別

class ExtendedTableModel extends DefaultTableModel {
    public Class<?> getColumnClass(int c) {
        return getValueAt(0, c).getClass(); // 依首行值決定列類型
    }
}

步驟 2:實作 TableCellRenderer

class GenderTableCellRenderer extends JPanel implements TableCellRenderer {
    private String cellValue;
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        cellValue = (String) value;
        setBorder(hasFocus ? UIManager.getBorder("Table.focusCellHighlightBorder") : null);
        return this;
    }
    public void paint(Graphics g) {
        if ("男".equalsIgnoreCase(cellValue) || "male".equalsIgnoreCase(cellValue))
            drawImage(g, new ImageIcon("icon/male.gif").getImage());
        else if ("女".equalsIgnoreCase(cellValue) || "female".equalsIgnoreCase(cellValue))
            drawImage(g, new ImageIcon("icon/female.gif").getImage());
    }
    private void drawImage(Graphics g, Image img) {
        g.drawImage(img, (getWidth()-23)/2, (getHeight()-21)/2, null);
    }
}

步驟 3:套用至指定列

TableColumn genderCol = table.getColumnModel().getColumn(2);
genderCol.setCellRenderer(new GenderTableCellRenderer());

進階提示

  • 每列可設不同渲染器;若需「每行每列不同」,在 `getCellRenderer(row, col)` 邏輯中判斷返回。
  • 大量資料建議實作 `AbstractTableModel` 並配合分頁/虛擬化。
  • 編輯器 `TableCellEditor` 可搭配渲染器實現「所見即所得」編輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved