Я бы порекомендовал вам заполнить компоненты vaadin, такие как ComboBox
, с DataProvider
. Позже это облегчит задачу.
Ваше собственное решение отлично работает, если элементы не добавлены позже в ComboBox
в другом месте. Если элементы добавлены, возможно, потребуется выполнить Collections.sort()
еще раз.
С небольшим изменением для использования DataProvider
:
ListDataProvider<Integer> dp = new ListDataProvider<>(cbItems);
// the first param is function that returns the value to sort
// in case of Integer it is that Integer itself.
dp.setSortOrder(i -> {return i;}, SortDirection.ASCENDING);
ComboBox<Integer> combo = new ComboBox<>();
combo.setDataProvider(dp);
Теперь, если вы позже добавите предметы в комбо (через исходный Collection
):
// add some items to see where they are sorted
cbItems.add(102);
cbItems.add(113);
эти элементы должны быть отсортированы в правильном месте в ComboBox
.
Тогда рассмотрим немного более сложный пример. Если бы у вас был класс вроде:
@RequiredArgsConstructor
public class Wrapper {
@Getter
private final Integer id;
@Getter
private final String name;
}
и вы хотели отсортировать его по убыванию имени, это было бы так (с тестовыми данными):
// generate some dymmy data
Collection<Wrapper> wrappers = new HashSet<>();
for(int i=1000; i<=2000; i+=150) {
wrappers.add(new Wrapper(i,
"Rand"+ThreadLocalRandom.current().nextInt(5000, 6000)) );
}
ListDataProvider<Wrapper> dpWrappers = new ListDataProvider<>(wrappers);
// now function returns the name of the wrapper to sort as sort argument
dpWrappers.setSortOrder(wrapper -> {return wrapper.getName();},
SortDirection.DESCENDING);
ComboBox<Wrapper> comboWrappers = new ComboBox<>();
comboWrappers.setDataProvider(dpWrappers);
// remember to set this to have the name of wrapper in combo vaptions
// instead of the value of Wrapper.toString();
comboWrappers.setItemCaptionGenerator( item -> {return item.getName();});
person
pirho
schedule
24.01.2018