JTable分页

Java Swing JTable分页和Java Struts分页
  其实写这篇文章并没什么大的意义,因为只要是做过数据库操作的人都知道分页对于查询和数据存储的重要性,而且分页机制我想大家都很清楚了。

  我只是记录下自己做过项目的一些感受和对分页的个人理解而已。希望能够和大家一起讨论关于分页的更好的机制和实现方法。

  对于分页显示,必须做到重用性高,耦合性好,高内聚吧,这是我个人的理解了。因为你不可能为每个查询结果集写个分页方法吧。

下面重复一下分页的策略吧:

1. 对于一些数据库而言,有自己的分页方法。比如MySql使用limit子句实现分页,而Oracle使用rownum来限制结果集的大小和位置。

2. 分页的两个侧路:一种是将全部的内容查询出来再分页(查完再分);一种是根据页要显示的内容去查询(用多少查多少)。其实两种分页方法从字面上很容易理解的,但是具体使用的时候就是查完再分大多用在查询比较复杂的实例上。而用多少查多少是用在结果集很大,而且分页麻烦的实例上。(我在这里说的都针对查完再分。)

分页的规则(公式)

如果有32条记录,每页显示5条;

页数= (

——记录条数%每页条数==0 页数为记录条数/每页条数;

——否则 页数为记录条数/每页条数+1;

)很容易理解吧。

那么第N页所要显示的数据是那个范围呢(记录一般从0开始计算)?

——(N-1)*每页条数<=序号<N*每页条数。如上面的例子 第二页是从(2-1)*5<=序号<2*5;

 

这个原则是针对查完再分的方法写的。如果是用多少查多少的话就需要有另一个方法来做。

稍微提一下:就是将大的集合传入到一个小的集合。在需要显示的界面上传入小的集合就可。

 

上面都是写分页的思想和策略。

下面介绍Java swing JTable分页和Struts分页异同;

一,swing JTable 分页。

如果有过GUI编程经验的人应该知道,JTable是一个二维数组,所以针对二维数组的分页方法在数据存储的实现上比struts麻烦,因为从数据库中查询到的结果集不管是ResultSet集合还是List集合,都是一个线性的一维数组(可以这么理解)

下面是具体JTable分页的实现。

import java.util.ArrayList;

import javax.swing.JTable;

public class PaginationShow {

  public static int currentPage = 1; //当前页码数

  public static int totalPage=0; //总页数

  public static int RowPerPage = 5; //每页的记录数

  public static int column=0;//记录结果集中的列总数

  public static int totalRowCount = 0;//结果集中的记录行总数

  public static Object[][]resultDate;//存储结果集

  public static int restDate;//记录中最后页的总数

  /**

* 构造方法,获取表结果集中的所有行数。这个构造方法是我自己写的,针*ArrayList转换为二维数组的操作

  * @param ArrayList

  */

  public PaginationShow(ArrayList al){

  //建立数组转化对象,将结果集中的数据存储在二维数组中

  ResultToArrayCon rta = new ResultToArrayCon();//(这个类是未来将一维数组转换为二维数组而专门设定的。)

  //获取记录中的列数

  column = Integer.parseInt(al.get(al.size()-1).toString());

//这句话就是获取结果集中的列数,对于Oralce数据库来说,记录的列数很容易获取,//我专门写在一个结果集转化类即上面的ResultToArrayCon 中了,

//对于Oracle JDBC查询数据库来说,获取某个表的列数的方法是:

//ResultSetMetaData metaData = rs.getMetaData(); 

//int numberOfColumns = metaData.getColumnCount();//获取表中记录列数 

  totalRowCount = (al.size()-1)/column;//获取记录中的总行数

  totalPage = totalRowCount/RowPerPage+1;//每页的记录数获取

  restDate = totalRowCount%RowPerPage;

  resultDate = rta.resultToArray(al);//存储结果集到数组中

  }

  /**

  *这个方法是同组的另一个人写的,他直接传递过来的是一个二维数组,所以实 

  *现比较容易,我传递过来的是集合。所以要转换成二维数组,所以上面不一样

  *哦,每个人都有自己的实现方法,自己去写吧。

  */

  public PaginationShow(Object[][]myobj){

  if(myobj!=null){

  column = myobj[0].length;

  totalRowCount = myobj.length;//获取记录中的总行数

  }

  totalPage = totalRowCount/RowPerPage+1;//每页的记录数获取

  restDate = totalRowCount%RowPerPage;

  resultDate = myobj;//存储结果集到数组中

  }

  public PaginationShow(){}

  /**

  * 存储数据,将二维数组中的数据存入每页要显示的新数组中,下面这个存储数* 据的方法非常重要,要将一个大的二维数组(所有的数据库数据)分页显示在*JTable上,必须有一个小的二维数组来存储每页的数据。而这个算法就是下面的

*方法。

*方法是我自己写的不够完整,希望大家能够改正并给出完美的答案。

  * @return

  */

  public Object [][] storeDate(){

  //每页存储数据二维数组建立

  Object [][] rowDateCurrentPage = new Object[RowPerPage][column];

  //如果当前页是页总数,并且剩余记录能被RowPerPage整除

  if(this.getCurrentPage()<this.totalPage)//如果当前页小于总页数,即有下一页

  {//将要显示的页的序号数据存储到rowCurrentPage中

  // RowPerPage*(this.getCurrentPage()-1)符合上面的分页思想

//而RowPerPage*(this.getCurrentPage()-1)+RowPerPage却与上面的分页思想有//点不同,个人理解问题而已。

  for(int i=RowPerPage*(this.getCurrentPage()-1);

  i<RowPerPage*(this.getCurrentPage()-1)+RowPerPage;

  i++){

  for(int j=0;j<column;j++){

  rowDateCurrentPage[i%RowPerPage][j] = resultDate[j];

  }

  }

  }

  //如果当前页是页总数,并且剩余记录不能被RowPerPage整除

  if(this.getCurrentPage()==this.totalPage){

  // restDate这个就是为了存储最后没有除尽的结果集。

  for(int i=RowPerPage*(this.getCurrentPage()-1);

  i<RowPerPage*(this.getCurrentPage()-1)+restDate;

  i++){

  for(int j=0;j<column;j++){

  rowDateCurrentPage[i%RowPerPage][j] = resultDate[j];

  }

  }

  }

  return rowDateCurrentPage;

  }

你可能感兴趣的:(oracle,mysql,swing,struts,J#)