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

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

在Swing JTable中进行分页看起来很不错。

这是一段摘录:

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

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

所以我们挖掘,并试图自己建立一个解决方案。 我们最终想出的是一个改编的TableModel类来处理分页。

实现此目的的另一个选项是使用无滚动条的滚动窗格和几个导航按钮来实现控制。 已添加的按钮是原型的普通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); } 

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

您可以尝试使用2个查询,第一个查询是计算DB中的总行数,第二个查询是针对实际数据:)对于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 

在服务层,你只需要使用这样的限制函数:


 public List findAllComment(Integer pageNumber,Integer rowsPerPage){
        尝试{
             List listWP = new ArrayList();
             preparedFindAll.setInt(1,(rowsPerPage *(pageNumber-1)));
             preparedFindAll.setInt(2,rowsPerPage);
             ResultSet rs = preparedFindAll.executeQuery();
             while(rs.next()){
                 WPComment comment = new 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(评语);
             }
             return listWP;
         } catch(SQLException ex){
             Logger.getLogger(TablePagingServiceJDBC.class.getName())。log(Level.SEVERE,null,ex);
         }

         return null;
     }

     public Integer countComments(){
        尝试{
            整数totalRows = 0;
             ResultSet rs = preparedCount.executeQuery();
             while(rs.next()){
                 totalRows = rs.getInt(“count(*)”);
             }
             return totalRows;
         } catch(SQLException ex){
             Logger.getLogger(TablePagingServiceJDBC.class.getName())。log(Level.SEVERE,null,ex);
         }

        返回0;
     }

或者你可以在Swing上的Project Page Table Paging 🙂 上把我分到github 上 🙂

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

或者,您可以使用QuickTable项目 。

截图

这是运行中的DBTable组件:

嵌入在JFrame中的DBTable组件,其中包含从CSV文件加载的数据。

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

  com.h2database h2 1.4.187  

参考

  • QuickTable基础教程
  • QuickTable官方教程
  • 下载最新的jar
  • h2数据库