Java 使用页面工厂处理分页

Java 使用页面工厂处理分页,java,javafx,pagination,javafx-8,Java,Javafx,Pagination,Javafx 8,我有一个表视图,带有一个锚定窗格面板和两个子面板、一个表视图和一个分页。分页没有直接链接到表视图(就像您放置了一个带有更新标签的按钮) 我发现的唯一例子是分页本身通过其setPageFactory方法处理UI更新 我知道我不应该这样设计,不幸的是我现在没有时间去改变它。下面是我目前的解决方案: paginationTab1.setPageFactory(e -> { updateTableViewWithOffset(e); //hack, as the paginatio

我有一个表视图,带有一个锚定窗格面板和两个子面板、一个表视图和一个分页。分页没有直接链接到表视图(就像您放置了一个带有更新标签的按钮)

我发现的唯一例子是分页本身通过其
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;
});

这是一个可接受的解决方法(
returnnull
不能很好地更新之后的UI…)吗?或者有没有一种方法可以获得与
setPageFactory
方法提供的相同的侦听器行为(即在分页箭头或分页编号上单击时获取页面偏移量)?

您可以观察
分页
currentPageIndexProperty()

这里有一个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);
    }
}
import java.util.stream.collector;
导入java.util.stream.IntStream;
导入javafx.application.application;
导入javafx.beans.property.ReadOnlyStringWrapper;
导入javafx.scene.scene;
导入javafx.scene.control.Pagination;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.stage;
公共类独立分页测试扩展应用程序{
私有静态最终int NUM_PAGES=20;
私有静态最终整数项每页=20;
@凌驾
公共无效开始(阶段primaryStage){
TableView table=新TableView();
TableColumn col=新的TableColumn(“项目”);
table.getColumns().add(col);
col.setCellValueFactory(cellData->new ReadOnlyStringWrapper(cellData.getValue());
可更新(表,0);
分页分页=新分页();
分页。setPageCount(页数);
pagination.currentPageIndexProperty().addListener((obs、oldIndex、newIndex)->
updateTable(表,newIndex.intValue());
BorderPane根=新的BorderPane(表,null,null,分页,null);
初始阶段。设置场景(新场景(根,800600));
primaryStage.show();
}
私有void updateTable(TableView表,整数索引){
int start=索引*每页的项目数+1;
int end=开始+每页的项目;
table.getItems().setAll(
IntStream.range(开始、结束)
.mapToObj(整数::toString)
.map(“项目”::concat)
.collect(Collectors.toList());
}
公共静态void main(字符串[]args){
发射(args);
}
}

谢谢,这正是我想要的!
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);
    }
}