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

时间:2016-02-12 07:47:52

标签: javafx

我有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);

1 个答案:

答案 0 :(得分:2)

FXCollections.observableArrayList“创建一个新的可观察列表,其中添加了项目” - 即它是一个可观察的列表,使用您传入的数据进行初始化。因此,对原始列表的更改将不会被反映出来在它创建的新列表中。

您需要FXCollections.observableList(...),其中“构造由原始列表支持的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);