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。是否有Vaadin组件或具有Java实现的库在索引值上运行?或有解决方法

解决方法

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

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);