Swing中一般用JScrollPan来进行滚动,不需要使用翻页。
如果非要翻页,有两种方式:
一次检索出全部数据,放到TableModel中,这时可以设计另一个TableModel做成一个类似滑动窗口的方式,每次在窗口Model中只映射原Model的部分数据。
一次检索出一页数据,这与网页中的翻页完全相同。
对第一种情况,下面给出一个实现:
public class PageTableModel extends AbstractTableModel implements TableModel,TableModelListener{
private TableModel baseModel
public PageTableModel(TableModel baseModel){
this.baseModel=baseModel
baseModel.addTableModelListener(this)
}
/**当前页,从0开始编号.
*/
private int currentPage
/**每页最多数据行数.
*/
private int pageSize=20
/**获取总页数。
*
* @return
*/
public int getPageCount(){
int mod=baseModel.getRowCount()%pageSize
int hasMode=mod>0?1:0
return baseModel.getRowCount()/pageSize+hasMode
}
public int getPageSize() {
return pageSize
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize
}
public int getCurrentPage() {
return currentPage
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage
}
@Override
public int getRowCount() {
if(getCurrentPage()<getPageCount()-1)return pageSize
return baseModel.getRowCount() % pageSize
}
@Override
public int getColumnCount() {
return baseModel.getColumnCount()
}
@Override
public String getColumnName(int columnIndex) {
return baseModel.getColumnName(columnIndex)
}
@Override
public Class<?>getColumnClass(int columnIndex) {
return baseModel.getColumnClass(columnIndex)
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return baseModel.isCellEditable(getBaseModelRow(rowIndex), columnIndex)
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return baseModel.getValueAt(getBaseModelRow(rowIndex), columnIndex)
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
baseModel.setValueAt(aValue, getBaseModelRow(rowIndex), columnIndex)
}
@Override
public void tableChanged(TableModelEvent e) {
int firstRow,lastRow
int minFirstRow=getBaseModelRow(0)
int maxFirstRow=getBaseModelRow(pageSize-1)
if(e.getFirstRow()>maxFirstRow)return
if(e.getLastRow()<minFirstRow)return
firstRow=getThisModelRow(e.getFirstRow())
if(firstRow<0)firstRow=0
lastRow=getThisModelRow(e.getLastRow())
if(lastRow<0)lastRow=this.pageSize-1
fireTableChanged(new TableModelEvent(this, firstRow, lastRow, e.getColumn(), e.getType()))
}
/**获取指定的行在底层Model中的行号.
*
* @param row
* @return
*/
private int getBaseModelRow(int row){
return getCurrentPage()*pageSize+row
}
/**获取指定的底层Model中的行号对应的当前Model的行号.
* 如果底层Model中指定的行号不在当前Model的显示范围内,应该返回-1。
*
* @param row
* @return
*/
private int getThisModelRow(int row){
if(row/pageSize !=getCurrentPage())return -1
return row%pageSize
}
}
读取你数据库的所有记录,这是总行数,然后你规定一下没页显示几条记录,然后还要记录一下当前的页数!比如现在一共是30记录,你页显示7条,那么就是5页。(30+7-1)/7=5,你刚进来的时候肯定是第一页,那么就把1传进来,第一页就是显示第1~第7条记录,点下一页传2进来,第二页现实低第8~14条记录!怎么去记录就要看你怎么操作了,如果你是用SQL语句的话就帮不了你了,因为不知道你用的什么数据库!如果在集合里去的话,你可以根据传入的参数来算出本页的开始记录数和结束的记录数,开始是:当前页*每页记录数-没页记录数,结束就是:当前页*没也记录数-1.因为集合的下标是从0开始的,所以要-1.