Vaadin DropDown/Select/Spinner最佳实践



我正在查看Vaadin组件,它看起来像是;青睐的";Vaadin中的Select组件不会在索引时运行。

使用此代码:

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A");

Select<String> select = new Select<>();
select.setItems(list);

所以当我有以下列表时:

  1. A
  2. B
  3. A

我选择第三个选项A,它将作为第一个选项出现在列表中,也是A。是否有一个带有java实现的Vaadin组件或库可以在索引值上运行?或者有没有变通办法。

最终用户将如何区分这些相同的选项?

Select组件依赖于equalshashCode方法来区分项目。在您的情况下,这两个字符串彼此相等,因此从组件的角度来看,它们是相同的。

因此,如果您对此有一个有效的用例,那么您将必须传递为该用例正确实现equals的项。

有几种方法可以做到这一点:创建自定义类、传递值映射、传递枚举等。在所有情况下,您可能都希望使用自定义项标签生成器。

有了地图,它会看起来像这样:

Map<Integer, String> values = new HashMap<>();
values.put(1, "A");
values.put(2, "B");
values.put(3, "A");
Select<Integer> select = new Select<>();
select.setItems(values.keySet());
select.setItemLabelGenerator(values::get);
add(select);

或者使用枚举,正如cfrick所建议的:

enum Option {
FIRST_A("A"), B("B"), SECOND_A("A");
private final String name;
Option(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
...
Select<Option> select = new Select<>();
select.setItems(Option.values());
select.setItemLabelGenerator(Option::getName);
add(select);

最新更新