我相信我在 Vaadin Grid 中发现了一个可以用下面的代码复制的错误。
我想在更改网格时保存网格的排序顺序,然后在加载网格时恢复它。主要问题是GridSortOrder
列表只是在排序侦听器中不断增加事件的大小,而不是替换排序列表。我相信这是 Vaadin 14-20 中的一个错误,因为它只有在我调用setColumnOrder()
下面的重置方法时才会发生(删除该调用它会按预期工作)。换句话说,调用setColumnOrder()
似乎GridSortOrder
在应该替换它时将列表添加到排序侦听器中的事件。如果您grid.getSortOrder()
在侦听器中这样做,这实际上也是如此,这意味着不仅是事件,而且还有网格受到损害。
这可以与下面的代码一致地复制。您首先需要通过单击列标题来更改描述列的排序顺序。然后只需单击重置按钮 5-10 次。完成此操作后,单击“描述”列标题以再次更改排序顺序。for 监听器将System.out
显示列表的大小 20GridSortOrder
而不是预期的 2 GridSortOrder
。将一遍又一遍地复制列。
Grid<Car> grid = new Grid<>();
grid.addColumn(Car::getName)
.setSortable(true)
.setComparator(Car::getName)
.setKey("Name")
.setHeader("Name");
grid.addColumn(Car::getPrice)
.setSortable(true)
.setComparator(Car::getPrice)
.setKey("Price")
.setHeader("Price");
grid.addColumn(Car::getDescription)
.setSortable(true)
.setComparator(Car::getDescription)
.setKey("Description")
.setHeader("Description");
grid.setItems(listOfCars);
grid.setColumnReorderingAllowed(true);
grid.setMultiSort(true);
grid.addSortListener(event -> {
System.out.println("Event: " + event.getSortOrder().size() + " : " + event.isFromClient());
System.out.println("Grid: " + grid.getSortOrder().size() + " : " + event.isFromClient());
});
defaultSort(grid);
Button resetButton = new Button("Reset", click -> {
System.out.println("Reset: " + grid.getSortOrder().size());
defaultSort(grid);
grid.setColumnOrder(
grid.getColumnByKey("Name"),
grid.getColumnByKey("Price"),
grid.getColumnByKey("Description"));
});
add(grid, resetButton);
private void defaultSort(Grid grid) {
grid.sort(List.of(
new GridSortOrder<>(grid.getColumnByKey("Name"), SortDirection.ASCENDING),
new GridSortOrder<>(grid.getColumnByKey("Price"), SortDirection.ASCENDING)
));
}
如果我grid.setColumnOrder()
从上面删除,List<GridSortOrder>
则按预期工作,并且在事件侦听器中是两个。特别有趣的是,event.getSortOrder().size()
每次resetButton
单击都会增加 2(但您只会在排序侦听器中看到它)。不管setColumnOrder()
是在调用之前还是之后defaultSort()
。
考虑到这一点,如果您进行调试grid.setColumnOrder()
,它似乎会调用updateClientSideSorterIndicators(sortOrder)
这是我认为是原因的原因,并且是将其添加到GridSortOrder
列表中的位置。话虽如此,我不确定如何从这里开始,以便在单击“重置”按钮时可以重置网格的设置。
仅供参考:这对我来说是个问题,因为我正在尝试将 Grid 的状态保存到数据库中,以便当用户重新加载屏幕(一个非常复杂的屏幕)时,他们的所有网格设置包括排序顺序、列顺序、等等都被保留了。然而,有了这个错误,就不可能保存排序顺序。
PS:这在 Vaadin 14 和 Vaadin 20 中似乎都是正确的。