Vaadin DropDown/Select/Spinner 最佳实践?
Vaadin DropDown/Select/Spinner best practice?
我正在查看 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);
所以当我有以下列表时:
- 一个
- B
- 一个
然后我选择第三个选项 A,它会显示为列表中的第一个选项,也是 A。是否有具有 java 实现的 Vaadin 组件或库,其中 运行 索引值?或者是否有解决方法。
最终用户如何区分这些相同的选项?
Select
组件依赖于 equals
和 hashCode
方法来区分项目。在您的情况下,这两个字符串彼此相等,因此从组件的角度来看它们是相同的。
因此,如果您有一个有效的用例,则必须传递 equals
已针对该用例正确实施的项目。
有几种方法可以做到这一点:制作自定义 class、传入值映射、传入枚举等。在所有情况下,您可能都希望使用自定义项目标签生成器。
有了地图,它看起来像这样:
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);
我正在查看 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);
所以当我有以下列表时:
- 一个
- B
- 一个
然后我选择第三个选项 A,它会显示为列表中的第一个选项,也是 A。是否有具有 java 实现的 Vaadin 组件或库,其中 运行 索引值?或者是否有解决方法。
最终用户如何区分这些相同的选项?
Select
组件依赖于 equals
和 hashCode
方法来区分项目。在您的情况下,这两个字符串彼此相等,因此从组件的角度来看它们是相同的。
因此,如果您有一个有效的用例,则必须传递 equals
已针对该用例正确实施的项目。
有几种方法可以做到这一点:制作自定义 class、传入值映射、传入枚举等。在所有情况下,您可能都希望使用自定义项目标签生成器。
有了地图,它看起来像这样:
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);