12.7Swing控件8 JTable

JTable 是基于 MVC(Model-View-Controller)模式设计的:

  • 视图(View):负责表格的显示方式(如单元格边框、颜色、字体等)。
  • 模型(Model):存储表格数据并提供访问接口。
  • 控制器(Controller):处理用户交互(如点击、编辑)。

这种分离使得 JTable 非常灵活,可以自定义显示和数据处理逻辑。

基本用法

创建一个简单的 JTable 通常需要以下步骤:

  1. 准备数据:可以使用二维数组或 Vector 存储表格数据。
  2. 创建表格模型:可以使用默认的 DefaultTableModel,或自定义 TableModel 接口。
  3. 创建 JTable 实例:将模型传递给 JTable 构造函数。
  4. 将 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 提供了几种表格模型:

  1. DefaultTableModel:最常用的模型,支持动态添加、删除行和列,数据类型为 Object。

  2. 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 的外观可以通过多种方式自定义:

  1. 设置列宽和行高

    table.getColumnModel().getColumn(0).setPreferredWidth(50); // 设置第一列宽度
    table.setRowHeight(30); // 设置行高
    
  2. 设置单元格渲染器(Cell Renderer)
    渲染器决定单元格内容的显示方式,例如对齐方式、颜色等。

    // 设置所有单元格内容居中显示
    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment(JLabel.CENTER);
    table.setDefaultRenderer(Object.class, centerRenderer);
    
  3. 自定义特定列的渲染器

    // 设置年龄列右对齐
    DefaultTableCellRenderer rightRenderer = new DefaultTableCellRenderer();
    rightRenderer.setHorizontalAlignment(JLabel.RIGHT);
    table.getColumnModel().getColumn(2).setCellRenderer(rightRenderer);
    
  4. 设置表格选择模式

    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);
});
  1. 行选择事件
    通过实现 ListSelectionListener 接口监听行选择变化。

    table.getSelectionModel().addListSelectionListener(e -> {
        if (!e.getValueIsAdjusting()) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow != -1) {
                System.out.println("选中行: " + selectedRow);
            }
        }
    });
    

高级用法

  1. 表格排序

    table.setAutoCreateRowSorter(true); // 启用表格排序
    
  2. 表格过滤
    需要使用 RowFilter 和 TableRowSorter:

    TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
    table.setRowSorter(sorter);
    
    // 设置过滤条件(例如过滤出年龄大于30的行)
    sorter.setRowFilter(RowFilter.regexFilter("3[0-9]", 2));
    
  3. 添加表格工具栏
    可以在表格上方添加按钮等控件,实现添加、删除、导出等功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chxii

小小打赏,大大鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值