问题描述
我正在查看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。是否有Vaadin组件或具有Java实现的库在索引值上运行?或有解决方法。
解决方法
最终用户将如何区分那些相同的选项?
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);