在 Java Swing 桌面應用開發中,將大量數據分頁顯示在 JTable 中是常見需求。本文將詳細介紹一種基於內存分頁的實現方案,包含完整的代碼示例與核心邏輯解析,幫助開發者快速掌握 JTable 數據分頁技術。
採用「大集合+小集合」雙層結構:啟動時一次性查詢所有數據存入大集合,根據當前頁碼從大集合切片數據到小集合,最後綁定至 JTable 顯示。此方案適合數據量中等、不頻繁變動的場景。
import java.util.ArrayList;
import java.util.List;
import com.yu.entity.User;
public class PageController {
private List<User> bigList = new ArrayList<>(); // 全量數據
private List<User> smallList = new ArrayList<>; // 當前頁數據
private static int curentPageIndex = 1; // 當前頁碼
private int countPerpage = 10; // 每頁條數
private int pageCount; // 總頁數
private int recordCount; // 總記錄數
// 初始化塊:類加載時自動查詢數據並計算總頁數
{
this.bigList = new Utils().query(); // 查詢數據庫
this.recordCount = bigList.size();
this.pageCount = (recordCount % countPerpage == 0)
? recordCount / countPerpage
: recordCount / countPerpage + 1;
}
public PageController() {}
public PageController(int curentPageIndex) {
this.curentPageIndex = curentPageIndex;
}
// 獲取當前頁數據
public List<User> setCurentPageIndex() { return select(); }
// 下一頁
public List<User> nextPage() {
if (curentPageIndex < pageCount) curentPageIndex++;
return select();
}
// 上一頁
public List<User> previousPage() {
if (curentPageIndex > 1) curentPageIndex--;
return select();
}
// 核心切片邏輯
private List<User> select() {
smallList.clear(); // 關鍵:每次查詢前清空
int start = (curentPageIndex - 1) * countPerpage;
int end = Math.min(curentPageIndex * countPerpage, recordCount);
for (int i = start; i < end; i++) {
smallList.add(bigList.get(i));
}
return smallList;
}
}
// 上一頁按鈕事件
private void jButton8ActionPerformed(ActionEvent evt) {
List<User> list = new PageController().previousPage();
viewAll(list);
}
// 首頁按鈕事件
private void jButton10ActionPerformed(ActionEvent evt) {
List<User> list = new PageController(1).setCurentPageIndex();
viewAll(list);
}
// 下一頁按鈕事件
private void jButton9ActionPerformed(ActionEvent evt) {
List<User> list = new PageController().nextPage();
viewAll(list);
}
// 綁定數據到 JTable
public void viewAll(List<User> list) {
Object[][] data = new Object[list.size()][3];
for (int i = 0; i < list.size(); i++) {
data[i][0] = i + 1; // 行號
data[i][1] = list.get(i).getUserid(); // 工號
data[i][2] = list.get(i).getTruename(); // 姓名
}
jTable1.setModel(new DefaultTableModel(data,
new String[]{"行號", "工號", "姓名"}));
}
本方案適合數據量 < 10 萬條的中小型應用。大數據場景建議改為: