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