JavaFX TableView 分页 - 在更新 ObservableList 数据时不更新 TableView



我有一个TableView Pagination. 像这样(简化):

public void createPagination() {
    Pagination pagination = new Pagination((allDataCount / rowsPerPage) + 1, 0);
    pagination.setPageFactory(this::createPage);
}
private Node createPage(int pageIndex) {
    int fromIndex = pageIndex * rowsPerPage;
    int toIndex = Math.min(fromIndex + rowsPerPage, allDataCount);
    table.setItems(FXCollections.observableArrayList(data.subList(fromIndex, toIndex)));
    return new BorderPane(table);
}

问题是,当我对dataObservableList)进行更新时。更改在TableView中不可见。

在我看来,问题出在data.subList.如果我使用 table.setItems(data) 设置项目,则所有更改都会立即显示在TableView中。

任何想法,我该如何解决这个问题?


编辑

我正在更新这样的数据:

//prepare new/changed Test object
Test test = new Test();
test.setId(1000);
int selectedIndex = table.getSelectionModel().getSelectedIndex() + pageIndex * rowsPerPage;
data.set(selectedIndex, test);

FXCollections.observableArrayList "创建一个新的可观察列表,其中包含添加到其中的项目" - 即它是一个使用您传入的数据初始化的可观察列表。因此,对原始列表的更改不会反映在其创建的新列表中。

您需要FXCollections.observableList(...),它"构造由原始列表支持的可观察列表" - 即对基础列表的更改将反映在新列表中,反之亦然。

所以你想要

table.setItems(FXCollections.observableList(data.subList(fromIndex, toIndex)));

现在,表格显示的列表只是整个data列表的一部分的视图。因此,对table.getItems()的更改对data可见,反之亦然。但是,表视图仅观察table.getItems(),即使data是可观察的列表,也不会将更改data的通知传递给table.getItems()。因此,您需要对表正在观察的列表进行更改:

int selectedIndex = table.getSelectionModel().getSelectedIndex() ;
table.getItems().set(selectedIndex, test);

最新更新