【发布时间】:2018-05-05 22:12:26
【问题描述】:
我想在 Vaadin Grid 组件上将所选行(在多选模式下)设置为第一个显示的行,即按所选行排序。
有人知道这是否可能吗?
【问题讨论】:
标签: java sorting grid vaadin comparator
我想在 Vaadin Grid 组件上将所选行(在多选模式下)设置为第一个显示的行,即按所选行排序。
有人知道这是否可能吗?
【问题讨论】:
标签: java sorting grid vaadin comparator
这是可能的。我在这里提出一种解决方案,它有四个需要注意的点。不过可能有更优雅的解决方案。
第 1 点和第 2 点通过创建同时实现 SortEvent.SortListener 的 Comparator 得到满足
@RequiredArgsConstructor
// above is a lombok annotation to generate constructor
// SelectedFirstComparator(grid, defaultComparator);
public class SelectedFirstComparator<T>
implements SerializableComparator<T>, SortListener<GridSortOrder<T>> {
private final Grid<T> grid; // used to dig selected rows
// defaultComparator is used when selection status is not taken
// account to handle rest of sorting, related to point 4
private final SerializableComparator<T> defaultComparator;
// sortOrder is used to inverse the sorting order between
// selected & not selected items
// if not used selected items will change between first & last rows
// and we need them always first
private int sortOrder = 1;
@Override
public int compare(T o1, T o2) {
boolean o1Selected = grid.getSelectedItems().contains(o1);
boolean o2Selected = grid.getSelectedItems().contains(o2);
// if one is selected and one is not the selected one "wins"
if(o1Selected && !o2Selected) return 1 * sortOrder;
if(!o1Selected && o2Selected) return -1 * sortOrder;
// if both are selected arrange amongst first rows
// with default comparator
// if both are not-selected arrange them to natural order
// with default comparator
return defaultComparator.compare(o1, o2);
}
// This method is listening the sort order change
// and updating the sortOrder to keep selected rows as firts
@Override
public void sort(SortEvent<GridSortOrder<T>> event) {
switch(event.getSortOrder().get(0).getDirection()) {
case ASCENDING:
sortOrder = -1;
break;
case DESCENDING:
sortOrder = 1;
break;
}
}
}
第 3 点
您需要添加SelectedFirstComparator 的实例作为每个可排序列的比较器,例如
col1.setComparator(col1Comparator);
col2.setComparator(col2Comparator);
...
对于每个 colXcomparator,您需要在构造时提供相应的默认比较器来处理该列的默认排序。如果 col1 是 String 类型,它将类似于
SelectedFirstComparator<GridEntity> col1Comparator =
new SelectedFirstComparator<GridEntity>( grid, (e11, e12) -> {
return e11.getName().compareTo(e12.getName());
}
);
第 4 点
要让比较器监控排序顺序和sort() 方法更新sortOrder,您需要将所有比较器注册到网格为SortListener
grid.addSortListener(col1Comparator);
grid.addSortListener(col2Comparator);
...
【讨论】: