Java Swing 分页列表

在开发桌面应用程序时,我们经常需要展示大量的数据,并且需要将这些数据分成多个页面进行展示。Java Swing 提供了一种简单而强大的分页列表组件,可以满足我们的需求。本文将介绍如何使用 Java Swing 实现一个分页列表,并提供代码示例。

什么是分页列表

分页列表是一种常见的数据展示方式,将大量的数据分成若干个页展示,每页显示固定数量的数据。通过分页列表,我们可以更好地组织和管理数据,使用户能够方便地浏览和操作大量的数据。

Java Swing 中的分页列表组件

Java Swing 提供了一个名为 JTable 的组件,可以方便地实现分页列表。JTable 是一个表格组件,可以展示和编辑数据。我们可以通过设置 JTable 的数据模型和分页器来实现分页列表的功能。

分页模型

在实现分页列表之前,我们需要一个分页模型,用来管理数据的分页和展示。下面是一个简单的分页模型的代码示例:

public class PaginationModel {
    private List<Object> data;  // 数据列表
    private int pageSize;       // 每页显示的数据数量
    private int currentPage;    // 当前页码

    public PaginationModel(List<Object> data, int pageSize) {
        this.data = data;
        this.pageSize = pageSize;
        this.currentPage = 1;
    }

    // 获取当前页的数据列表
    public List<Object> getPageData() {
        int fromIndex = (currentPage - 1) * pageSize;
        int toIndex = Math.min(currentPage * pageSize, data.size());
        return data.subList(fromIndex, toIndex);
    }

    // 获取总页数
    public int getPageCount() {
        return (int) Math.ceil((double) data.size() / pageSize);
    }

    // 切换到下一页
    public void nextPage() {
        if (currentPage < getPageCount()) {
            currentPage++;
        }
    }

    // 切换到上一页
    public void prevPage() {
        if (currentPage > 1) {
            currentPage--;
        }
    }

    // 切换到指定页
    public void gotoPage(int page) {
        if (page >= 1 && page <= getPageCount()) {
            currentPage = page;
        }
    }
}

分页列表

有了分页模型后,我们可以将其与 JTable 组件结合使用,实现一个分页列表。下面是一个简单的分页列表的代码示例:

public class PaginationTable extends JTable {
    private PaginationModel model;
    private int pageSize;
    private int currentPage;

    public PaginationTable(PaginationModel model, int pageSize) {
        super();
        this.model = model;
        this.pageSize = pageSize;
        this.currentPage = 1;

        setModel(new AbstractTableModel() {
            @Override
            public int getRowCount() {
                return Math.min(pageSize, model.getPageCount() - (currentPage - 1) * pageSize);
            }

            @Override
            public int getColumnCount() {
                return model.getColumnCount();
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return model.getPageData().get((currentPage - 1) * pageSize + rowIndex);
            }
        });
    }

    // 切换到下一页
    public void nextPage() {
        model.nextPage();
        currentPage++;
        ((AbstractTableModel) getModel()).fireTableDataChanged();
    }

    // 切换到上一页
    public void prevPage() {
        model.prevPage();
        currentPage--;
        ((AbstractTableModel) getModel()).fireTableDataChanged();
    }

    // 切换到指定页
    public void gotoPage(int page) {
        model.gotoPage(page);
        currentPage = page;
        ((AbstractTableModel) getModel()).fireTableDataChanged();
    }
}

使用分页列表

使用分页列表非常简单,只需要创建一个 JFrame,将 PaginationTable 添加到其中,并设置数据模型和分页器。下面是一个使用分页列表的代码示例:

public class MainFrame extends JFrame {
    private PaginationTable table;

    public MainFrame() {
        super("分页列表示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 创建数据列表
        List<Object> data = new ArrayList<>();
        for (int i = 1; i <= 100; i++) {
            data.add("数据 " + i);
        }

        // 创建分页模型和分页列表
        PaginationModel model = new PaginationModel(data, 10);
        table = new Pagination