我有一个带有 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
相同的听众行为方法提供(即在分页箭头或分页编号上单击时获取页面偏移量)?
最佳答案
您可以关注 Pagination
的 currentPageIndexProperty()
:
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/