Javafx:重新排序TableView中的列

bet*_*man 13 tableview javafx-2

我有一个与TreeView相关联的TableView.每次选择TreeView中的节点时,TableView都会刷新不同的数据.

我能够对TableView中的任何列进行排序,只需按下相应的列标题即可.这很好.

但是:当我在树视图中选择一个不同的节点时,尽管列标题仍然显示为已排序.数据不是.

有没有办法以编程方式强制执行每次数据更改时用户所做的排序顺序?

bet*_*man 16

好的,我发现了怎么做.我会在这里总结它,以防它对其他人有用:

更新TableView的内容之前,必须保存sortcolum(如果有)和sortType:

        TableView rooms;
        ...
        TableColumn sortcolumn = null;
        SortType st = null;
        if (rooms.getSortOrder().size()>0) {
            sortcolumn = (TableColumn) rooms.getSortOrder().get(0);
            st = sortcolumn.getSortType();
        }
Run Code Online (Sandbox Code Playgroud)

然后,在完成 TableView中的数据更新后,必须恢复丢失的排序列状态并执行排序.

       if (sortcolumn!=null) {
            rooms.getSortOrder().add(sortcolumn);
            sortcolumn.setSortType(st);
            sortcolumn.setSortable(true); // This performs a sort
        }
Run Code Online (Sandbox Code Playgroud)

我没有考虑在排序中有多个列的可能性,但这对于这些信息来说非常简单.


小智 11

我有同样的问题,发现在更新数据后你只需要在表视图上调用函数sort():

TableView rooms;
...
// Update data of rooms
...
rooms.sort()
Run Code Online (Sandbox Code Playgroud)

表视图知道用于排序的列,因此排序函数将按所需顺序对新数据进行排序.此功能仅在Java 8中可用.


小智 6

如果您的TableView未重新初始化,您还可以执行以下操作:

TableColumn<BundleRow, ?> sortOrder = rooms.getSortOrder().get(0);
rooms.getSortOrder().clear();
rooms.getSortOrder().add(sortOrder);
Run Code Online (Sandbox Code Playgroud)


Mar*_*kob 6

fornacif的示例有效,但如果有多个排序顺序则不行(尝试按住Shift键单击第二列以创建二级排序顺序).

要对所有列进行重新排序,您需要执行以下操作:

List<TableColumn<Room, ?>> sortOrder = new ArrayList<>(roomTable.getSortOrder());
roomTable.getSortOrder().clear();
roomTable.getSortOrder().addAll(sortOrder);
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您使用 TableView.setItems() 方法,它似乎会重置 TableView 的几个方面。将 TableView 中的 ObservableList 保留在原位,清除其内容,然后添加新项目。然后, TableView.sort() 仍然会知道之前对哪些列进行了排序并且它会起作用。像这样:

  tableView.getItems().clear();
  tableView.getItems().addAll(newTableData);
  tableView.sort();
Run Code Online (Sandbox Code Playgroud)