JTable 是基于 MVC(Model-View-Controller)模式设计的:
- 视图(View):负责表格的显示方式(如单元格边框、颜色、字体等)。
- 模型(Model):存储表格数据并提供访问接口。
- 控制器(Controller):处理用户交互(如点击、编辑)。
这种分离使得 JTable 非常灵活,可以自定义显示和数据处理逻辑。
基本用法
创建一个简单的 JTable 通常需要以下步骤:
- 准备数据:可以使用二维数组或 Vector 存储表格数据。
- 创建表格模型:可以使用默认的 DefaultTableModel,或自定义 TableModel 接口。
- 创建 JTable 实例:将模型传递给 JTable 构造函数。
- 将 JTable 添加到滚动面板:由于表格可能很大,通常需要放在 JScrollPane 中。
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
public class JTableExample {
public static void main(String[] args) {
// 创建 JFrame
JFrame frame = new JFrame("JTable 示例");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setLocationRelativeTo(null);
// 定义表格列名
String[] columnNames = {"ID", "姓名", "年龄", "职业"};
// 定义表格数据
Object[][] data = {
{1, "张三", 25, "工程师"},
{2, "李四", 30, "设计师"},
{3, "王五", 22, "学生"},
{4, "赵六", 35, "经理"}
};
// 创建默认表格模型
DefaultTableModel model = new DefaultTableModel(data, columnNames);
// 创建 JTable
JTable table = new JTable(model);
// 将表格添加到滚动面板
JScrollPane scrollPane = new JScrollPane(table);
// 将滚动面板添加到窗口
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
// 显示窗口
frame.setVisible(true);
}
}
表格模型
JTable 的核心是表格模型,它负责存储数据并提供访问接口。Swing 提供了几种表格模型:
-
DefaultTableModel:最常用的模型,支持动态添加、删除行和列,数据类型为 Object。
-
AbstractTableModel:抽象类,需要继承并实现以下三个方法:
public int getRowCount()
:返回表格的行数。public int getColumnCount()
:返回表格的列数。public Object getValueAt(int row, int column)
:返回指定单元格的数据。
import javax.swing.table.AbstractTableModel;
public class PersonTableModel extends AbstractTableModel {
private String[] columnNames = {"ID", "姓名", "年龄", "职业"};
private Object[][] data = {
{1, "张三", 25, "工程师"},
{2, "李四", 30, "设计师"},
{3, "王五", 22, "学生"},
{4, "赵六", 35, "经理"}
};
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// 允许编辑年龄和职业列
return columnIndex == 2 || columnIndex == 3;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
data[rowIndex][columnIndex] = aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
自定义表格外观
JTable 的外观可以通过多种方式自定义:
-
设置列宽和行高:
table.getColumnModel().getColumn(0).setPreferredWidth(50); // 设置第一列宽度 table.setRowHeight(30); // 设置行高
-
设置单元格渲染器(Cell Renderer):
渲染器决定单元格内容的显示方式,例如对齐方式、颜色等。// 设置所有单元格内容居中显示 DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); centerRenderer.setHorizontalAlignment(JLabel.CENTER); table.setDefaultRenderer(Object.class, centerRenderer);
-
自定义特定列的渲染器:
// 设置年龄列右对齐 DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer(); rightRenderer.setHorizontalAlignment(JLabel.RIGHT); table.getColumnModel().getColumn(2).setCellRenderer(rightRenderer);
-
设置表格选择模式:
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // 单选模式
处理表格事件
JTable 支持多种事件处理:
单元格编辑事件:
通过实现 TableModelListener 接口监听表格数据变化。
model.addTableModelListener(e -> {
int row = e.getFirstRow();
int column = e.getColumn();
TableModel model = (TableModel) e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
System.out.println("单元格 (" + row + ", " + columnName + ") 值已更新为: " + data);
});
-
行选择事件:
通过实现 ListSelectionListener 接口监听行选择变化。table.getSelectionModel().addListSelectionListener(e -> { if (!e.getValueIsAdjusting()) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { System.out.println("选中行: " + selectedRow); } } });
高级用法
-
表格排序:
table.setAutoCreateRowSorter(true); // 启用表格排序
-
表格过滤:
需要使用 RowFilter 和 TableRowSorter:TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel()); table.setRowSorter(sorter); // 设置过滤条件(例如过滤出年龄大于30的行) sorter.setRowFilter(RowFilter.regexFilter("3[0-9]", 2));
-
添加表格工具栏:
可以在表格上方添加按钮等控件,实现添加、删除、导出等功能。