我正在查看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);
所以当我有以下列表时:
- A
- B
- A
我选择第三个选项A,它将作为第一个选项出现在列表中,也是A。是否有一个带有java实现的Vaadin组件或库可以在索引值上运行?或者有没有变通办法。
最终用户将如何区分这些相同的选项?
Select
组件依赖于equals
和hashCode
方法来区分项目。在您的情况下,这两个字符串彼此相等,因此从组件的角度来看,它们是相同的。
因此,如果您对此有一个有效的用例,那么您将必须传递为该用例正确实现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);