java - 使用页面工厂处理分页

标签 java javafx pagination javafx-8

我有一个带有 2 个 child 的 anchor Pane 面板的表 View 、一个表 View 和一个分页。分页没有直接链接到表格 View (就像你放置一个带有标签的按钮一样)。

我发现的唯一例子是分页本身通过它的 setPageFactory 处理 UI 更新。方法。

我知道我不应该这样设计它,不幸的是我现在没有时间改变它。所以这是我目前的解决方案:

paginationTab1.setPageFactory(e -> {
    updateTableViewWithOffset(e);
    //hack, as the pagination is not directly linked with the tableView
    //just return an empty component that is not managed by the parent component
    Label l = new Label();
    l.setManaged(false);
    return l;
});

这是一个可以接受的解决方法(return null 在...之后不能很好地更新用户界面)?或者有没有办法获得与 setPageFactory 相同的听众行为方法提供(即在分页箭头或分页编号上单击时获取页面偏移量)?

最佳答案

您可以关注 PaginationcurrentPageIndexProperty() :

paginationTab1.currentPageIndexProperty().addListener((obs, oldIndex, newIndex) -> 
    updateTableViewWithOffset(newIndex.intValue()));

这是一个 SSCCE:
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Scene;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class IndependentPaginationTest extends Application {

    private static final int NUM_PAGES = 20 ;
    private static final int ITEMS_PER_PAGE = 20 ;

    @Override
    public void start(Stage primaryStage) {
        TableView<String> table = new TableView<>();
        TableColumn<String, String> col = new TableColumn<>("Item");
        table.getColumns().add(col);

        col.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue()));
        updateTable(table, 0);

        Pagination pagination = new Pagination();
        pagination.setPageCount(NUM_PAGES);

        pagination.currentPageIndexProperty().addListener((obs, oldIndex, newIndex) -> 
                updateTable(table, newIndex.intValue()));

        BorderPane root = new BorderPane(table, null, null, pagination, null);
        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.show();
    }

    private void updateTable(TableView<String> table, Integer index) {
        int start = index * ITEMS_PER_PAGE + 1;
        int end = start + ITEMS_PER_PAGE ;
        table.getItems().setAll(
                IntStream.range(start, end)
                .mapToObj(Integer::toString)
                .map("Item "::concat)
                .collect(Collectors.toList()));
    }

    public static void main(String[] args) {
        launch(args);
    }
}

关于java - 使用页面工厂处理分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30323622/

相关文章:

java - 打开 Google Play 的通知

JavaFX - 获取非 ASCII 字符的 KeyEvent

mysql - 如何在此查询 laravel 中使用分页

java - 如何通过操作 ObservableList 来引发置换事件?

java - 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

mysql - Kaminari 可以在同一个 Controller 定义中使用两次吗?

sorting - 剑道网格服务器端过滤并且不工作

java - 构造时通过反射获取Java中的静态实例名称

java - 延长 Lollipops "heads-up"通知持续时间

java - Spring validator : having both annotation and validator implementation