【问题标题】:How to provide pagination support to a JTable in Swing?如何在 Swing 中为 JTable 提供分页支持?
【发布时间】:2009-09-26 12:45:07
【问题描述】:

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

【问题讨论】:

标签: java swing pagination jtable


【解决方案1】:

Paging in a Swing JTable 看起来是一篇不错的文章。

摘录如下:

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

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

所以我们深入研究,并尝试自己构建解决方案。 我们最终想出了一个适应的 TableModel 类来处理分页。

【讨论】:

    【解决方案2】:

    实现此功能的另一个选项是使用无滚动条的滚动窗格和几个导航按钮来实现控制。已经添加的按钮是原型的普通JButtons。

    下面添加了一个快速原型。它做了几个假设,其中一个是表模型有它的所有数据。可以做一些工作来确保行在导航时最终在视图顶部齐平。

    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);
    
    }
    

    alt text http://img7.imageshack.us/img7/4205/picture4qv.png

    【讨论】:

      【解决方案3】:

      您可以尝试使用 2 个查询,第一个查询是计算数据库中的总行数,第二个查询是针对 real 数据的 :) 对于 UI 端,您可以这样尝试:

      public class MainForm extends javax.swing.JFrame { private void initDefaultValue() { rowsPerPage = Integer.valueOf(cmbPageSize.getSelectedItem().toString()); totalRows = Main.getTablePagingService().countComments(); Double dblTotPage = Math.ceil(totalRows.doubleValue()/rowsPerPage.doubleValue()); totalPage = dblTotPage.intValue(); if (pageNumber == 1) { btnFirst.setEnabled(false); btnPrevious.setEnabled(false); } else { btnFirst.setEnabled(true); btnPrevious.setEnabled(true); } if (pageNumber.equals(totalPage)) { btnNext.setEnabled(false); btnLast.setEnabled(false); } else { btnNext.setEnabled(true); btnLast.setEnabled(true); } txtPageNumber.setText(String.valueOf(pageNumber)); lblPageOf.setText(" of " + totalPage + " "); lblTotalRecord.setText("Total Record " + totalRows + " rows."); List wPComments = Main.getTablePagingService().findAllComment(pageNumber, rowsPerPage); jTable1.setModel(new CommentTableModel(wPComments)); autoResizeColumn(jTable1); } private void btnFirstActionPerformed(ActionEvent evt) { pageNumber = 1; initDefaultValue(); } private void btnPreviousActionPerformed(ActionEvent evt) { if (pageNumber > 1) { pageNumber -= 1; initDefaultValue(); } } private void btnNextActionPerformed(ActionEvent evt) { if (pageNumber

      而在服务层,你只需要像这样使用限制功能:

      公共列表 findAllComment(整数 pageNumber,整数 rowsPerPage){ 尝试 { 列表 listWP = new ArrayList(); prepareFindAll.setInt(1, (rowsPerPage*(pageNumber-1))); 准备好的FindAll.setInt(2, rowsPerPage); 结果集 rs =preparedFindAll.executeQuery(); 而(rs.next()){ WPComment 评论 = 新的 WPComment(); comment.setCommentID(rs.getInt("comment_ID")); comment.setCommentAuthor(rs.getString("comment_author")); comment.setCommentDate(rs.getDate("comment_date")); comment.setCommentContent(rs.getString("comment_content")); listWP.add(comment); } 返回列表WP; } 捕捉(SQLException ex){ Logger.getLogger(TablePagingServiceJDBC.class.getName()).log(Level.SEVERE, null, ex); } 返回空值; } 公共整数计数评论(){ 尝试 { 整数总行数 = 0; 结果集 rs =preparedCount.executeQuery(); 而(rs.next()){ totalRows = rs.getInt("count(*)"); } 返回总行数; } 捕捉(SQLException ex){ Logger.getLogger(TablePagingServiceJDBC.class.getName()).log(Level.SEVERE, null, ex); } 返回0; }

      或者你可以在 github 上 fork 我Project Page Table Paging on Swing :)

      【讨论】:

        【解决方案4】:

        我写了一个Java分页工具dataj。它使用 JQuery dataTables 插件分页元数据来构建结果页面。 我还为 Java Swing 添加了一些客户端类,包括调用(服务器端)排序而不是在表模型内部排序的 TableRowSorter。 随时下载它,如果您有任何问题,请与我联系。它在 Apache 2 许可下。

        【讨论】:

          【解决方案5】:

          或者,您可以使用QuickTable project

          截图

          下面是DBTable 组件的实际应用:

          DBTable 组件嵌入在传统的JFrame 中。

          示例代码

          以下示例代码生成上一个屏幕截图中显示的窗口:

          import javax.swing.JFrame;
          import javax.swing.UIManager;
          
          import quick.dbtable.DBTable;
          
          public class QuickTableFrame extends JFrame {
          
              private static final long serialVersionUID = -631092023960707898L;
          
              public QuickTableFrame() {
                  try {
                      // Use system look and feel
                      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
          
                      // set Frame properties
                      setSize(300, 200);
                      setVisible(true);
                      setLocationRelativeTo(null);
                      setDefaultCloseOperation(EXIT_ON_CLOSE);
          
                      // create a new quicktable
                      DBTable dBTable1 = new DBTable();
          
                      // add to frame
                      getContentPane().add(dBTable1);
          
                      // set the database driver to be used, we are using jdbc-odbc driver
                      dBTable1.setDatabaseDriver("org.h2.Driver");
          
                      /*
                       * set the jdbc url,"quicktabledemo" is the data source we have
                       * created for the database
                       */
                      dBTable1.setJdbcUrl("jdbc:h2:mem:test;INIT=create table employee as select * from CSVREAD('test.csv');");
          
                      // set the select statement which should be used by the table
                      dBTable1.setSelectSql("select * from employee");
          
                      // to create the navigation bars for the table
                      dBTable1.createControlPanel();
          
                      // connect to database & create a connection
                      dBTable1.connectDatabase();
          
                      // fetch the data from database to fill the table
                      dBTable1.refresh();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
          
              public static void main(String[] args) {
                  // create a new table frame
                  QuickTableFrame myframe = new QuickTableFrame();
              }
          }
          

          资源和依赖项

          test.csv

          empid,emp_name,emp_dept,emp_salary
          1,Azalia,ornare,114918
          2,Jade,tristique,152878
          3,Willa,In scelerisque scelerisque,166733
          ...
          

          H2

          <dependency>
              <groupId>com.h2database</groupId>
              <artifactId>h2</artifactId>
              <version>1.4.187</version>
          </dependency>
          

          参考文献

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-28
          • 2019-03-25
          相关资源
          最近更新 更多