如何为 Swing 中的 JTable 提供分页支持?

2022-09-04 23:00:18

我在Swing Java中创建了一个使用JTable的GUI,现在我想通过使用分页来显示下一页信息。我该怎么做?


答案 1

在Swing JTable中分页看起来像一篇不错的文章。

以下是摘录:

据我所知,这个问题的解决方案在于分页的概念:只需检索用户想要查看的数据,仅此而已。这也意味着,如果用户向下滚动列表,您有时必须从数据库服务器(或应用程序服务器)获取额外的数据。

最重要的是,我感到惊讶的是,对于这个问题,并没有真正的开箱即用的解决方案(甚至没有复制粘贴解决方案)。任何认识J2EE平台的人,请不要犹豫,扩展我对J2EE平台的(相当有限的)知识。

因此,我们深入研究,并试图自己构建一个解决方案。我们最终想出的是一个经过改编的 TableModel 类来处理分页。


答案 2

实现此目的的另一个选项是使用无滚动条的滚动窗格和几个导航按钮来影响控件。已添加的按钮是原型的正常按钮。JButton

下面添加了一个快速原型。它做了几个假设,其中之一是表模型包含其所有数据。可以执行一些工作来确保行在导航时在视图顶部结束刷新。

private void buildFrame() {
    frame = new JFrame("Demo");
    frame.setSize(300, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addStuffToFrame();
    frame.setVisible(true);

}

private void addStuffToFrame() {
    final JTable table = getTable();
    final JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
    final JButton next = new JButton("next");
    final JButton prev = new JButton("prev");

    ActionListener al = new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            Rectangle rect = scrollPane.getVisibleRect();
            JScrollBar  bar = scrollPane.getVerticalScrollBar();
            int blockIncr = scrollPane.getViewport().getViewRect().height;
            if (e.getSource() == next) {
                bar.setValue(bar.getValue() + blockIncr);
            } else if (e.getSource() == prev) {
                bar.setValue(bar.getValue() - blockIncr);
            }
            scrollPane.scrollRectToVisible(rect);
        }
    };

    next.addActionListener(al);
    prev.addActionListener(al);

    JPanel panel = new JPanel(new BorderLayout());
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(prev);
    buttonPanel.add(next);
    panel.add(buttonPanel, BorderLayout.NORTH);
    panel.add(scrollPane, BorderLayout.CENTER);
    frame.getContentPane().add(panel);
}

private JTable getTable() {
    String[] colNames = new String[]{
            "col 0", "col 1", "col 2", "col 3"
    };

    String[][] data = new String[100][4];
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 4; j++) {
            data[i][j] = "r:" + i + " c:" + j;
        }
    }

    return new JTable(data,colNames);

}

可选文字 http://img7.imageshack.us/img7/4205/picture4qv.png