基于FXML的TableView分页控制器实现方案咨询
基于FXML的TableView分页实现方案
场景说明
已通过FXML将自定义FitWidthTableView嵌套进Pagination组件,现有控制器结构包含Spring注入的OutputDataRepository,需要实现总页数计算、每页数据量设置、分页数据填充的完整逻辑。
实现步骤及代码示例
1. 定义分页参数常量
在控制器中添加固定的分页配置常量,可根据业务需求调整:
// 每页显示的数据条数 private static final int PAGE_SIZE = 20; // 总数据量缓存 private long totalItems;
2. 完整控制器实现代码
public class DataViewerController implements Initializable { @FXML private Pagination pagination; @FXML private FitWidthTableView<OutputData> dataDisplayView; @FXML private TableColumn<OutputData, Integer> rowColumn; @Autowired private OutputDataRepository outputDataRepository; private static final int PAGE_SIZE = 20; private long totalItems; @Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { // 初始化行号列的映射逻辑 bindRowColumnValue(); // 计算总数据量与总页数 totalItems = outputDataRepository.count(); int totalPages = (int) Math.ceil((double) totalItems / PAGE_SIZE); // 配置分页组件 pagination.setPageCount(totalPages); pagination.setPageFactory(this::loadPageData); // 默认加载第一页数据 loadPageData(0); } // 绑定行号列的动态计算逻辑 private void bindRowColumnValue() { rowColumn.setCellValueFactory(cellData -> new SimpleIntegerProperty( pagination.getCurrentPageIndex() * PAGE_SIZE + cellData.getIndex() + 1 ).asObject()); } // 分页数据加载工厂方法 private Node loadPageData(int pageIndex) { // 构造分页请求(Spring Data JPA规范,pageIndex从0开始) Pageable pageable = PageRequest.of(pageIndex, PAGE_SIZE); Page<OutputData> currentPage = outputDataRepository.findAll(pageable); // 将当前页数据设置到表格 dataDisplayView.setItems(FXCollections.observableArrayList(currentPage.getContent())); // 切换页后重新绑定行号计算规则 bindRowColumnValue(); return dataDisplayView; } }
3. 关键注意事项
- 确保
OutputDataRepository继承自Spring Data JPA的PagingAndSortingRepository或JpaRepository,否则无法直接使用count()和findAll(Pageable)方法。 - 若需要对数据排序,可修改
PageRequest构造参数:PageRequest.of(pageIndex, PAGE_SIZE, Sort.by("id").ascending())。 - FXML中的
Pagination组件无需额外布局配置,页工厂会自动返回TableView作为当前页的展示内容。
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

