2016-02-12 142 views
0

我有TableViewPagination。像这样(简化):JavaFX TableView分页 - 不更新TableView更新ObservableList数据

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

回答

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); 
+0

Tnx for answer,但这仍然不能解决问题。 – Virtap

+0

您是否可以更新问题以显示如何更新数据? –

+0

我已更新我的问题。 – Virtap

相关问题