JavaFX TableView分页 – 无法创建基于fxml的解决方案

我在我的项目中使用JavaFX(也是Spring,Hibernate等)。

我正在尝试为TableView创建分页。 我找到了许多合理的解决方案,但所有这些都是基于控制器的解决方案。 这个解决方案中最好的。

但在我的情况下 – 我使用多个fxml文件,这些文件是在SceneBuilder中创建的,包含所有巨大的设计选项,并且包含TabPane,对于一个选项卡,我有一个FXML文件和一个控制器。

我有一个基本文件导入其他文件,在我的Main类中我加载它:

在此处输入图像描述

                                           

在我的statistics.fxml的控制器类中,我正在创建TableView和列:

 @FXML public TableView statisticsTableView; @FXML public TableColumn objectColumn; @FXML public TableColumn noteColumn; @FXML public TableColumn stageColumn; @FXML public TableColumn dateColumn; @FXML public TableColumn vagonColumn; @FXML public TableColumn repeatColumn; @FXML public TableColumn remarkIdColumn; 

以及此解决方案中的所有其他内容。 来自实体的信息被添加到我的表中,一切正常。 但!

当我试图添加分页时,问题就开始了,因为我无法理解我应该如何做到这一点。 我的Main方法如下所示:

 public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/spring/application-context.xml"); context.getBeanFactory().registerResolvableDependency(Stage.class, primaryStage); primaryStage.setTitle(Constants.MAIN_TITLE); primaryStage.setScene(new Scene((Parent) context.getBean(SpringFXMLLoader.class).load(Constants.FXML_PATH), 914, 542)); primaryStage.show(); } } 

在所有TableView-pagination示例中,在Main类中添加了分页,就像来自其他有效和已检查示例的代码一样:

 private Node createPage(int pageIndex) { int fromIndex = pageIndex * rowsPerPage; int toIndex = Math.min(fromIndex + rowsPerPage, data.size()); table.setItems(FXCollections.observableArrayList(data.subList(fromIndex, toIndex))); return new BorderPane(table); } @Override public void start(final Stage stage) throws Exception { Pagination pagination = new Pagination((data.size() / rowsPerPage + 1), 0); pagination.setPageFactory(this::createPage); Scene scene = new Scene(new BorderPane(pagination), 1024, 768); stage.setScene(scene); stage.setTitle("Table pager"); stage.show(); } public static void main(String[] args) throws Exception { launch(args); } 

有没有办法传递这个问题并将分页添加到我的TableView? 我会很高兴在这个问题上得到任何答案,问题不会在第一天受到影响。

解决!:

感谢James_D和他的解决方案 。 我试过这个变种,它工作得很好。 我的TableView现在已经加入了分页。

我添加到了我的statistics.fxml:

      

在我的控制器中,我添加了与此示例中相同的部件。 一切都很好。 非常感谢!

只需在statistics.fxml定义Pagination

  

然后在该类的控制器中配置它:

 @FXML private TableView statisticsTableView; @FXML private Pagination pagination ; public void initialize() { pagination.setPageFactory(this::createPage); // etc... } 

由于表本身由页面工厂放置在场景图中,因此在调用initialize()方法之后,即在解析FXML之后,它不是场景图的一部分。 因此,您可以直接在控制器中定义表(并且根本不包括在FXML文件中):

 private TableView statisticsTableView; @FXML private Pagination pagination ; public void initialize() { statisticsTableView = new TableView<>(); // create columns, etc... pagination.setPageFactory(this::createPage); // etc... } 

或者您可以在块中的FXML中定义它:

           

然后以通常的方式用@FXML将它注入控制器。