Vaadin14 Подсказка по выделению при помощи Combobox - PullRequest
2 голосов
/ 14 апреля 2020

Я использую Vaadin 14 + Java.

У меня есть выпадающий список с перечислением возможных элементов.

Я хочу отображать перечисление в выпадающем списке, как это возможно, но я хочу показать более длинный атрибут "name" при наведении курсора / всплывающей подсказке.

Я видел, что был такой же вопрос для более старых версий Vaadin (и, видимо, решения не было), и мне было интересно, есть ли возможность сделать это сейчас.

ComboBox

ComboBox<MyEnum> cb = new ComboBox<>();
cb.setLabel("MyComboBox");
cb.setItems(MyEnum.values());

//cb.setDescription --> does not exist for ComboBox?

Мой перечислимый класс:

public enum MyEnum {

    HIGH("High long name explanation"),
    MEDIOCRE("Mediocre long name explanation"),
    LOW("Low long name explanation");

    private final String name;

    private MyEnum(String name) {
        this.name = name;
    }

    public String getValue(){
      return name;
    }

}

1 Ответ

5 голосов
/ 14 апреля 2020

На уровне HTML создание всплывающей подсказки выполняется путем определения свойства title для элемента.

Но это свойство заголовка должно быть размещено в параметрах, а не в самом comboBox, а ComboBox не имеет java API для этого, как comboBox.setItemTooltipProvider(..).

Однако есть java API для определения рендерера, который затем будет применяться к каждому элементу. Вместо использования Renderer, который просто возвращает имя параметра как String, мы также можем использовать ComponentRenderer, который будет применен к каждому элементу. Там вы создаете компонент Span, содержащий отображаемое имя элемента (например, "HIGH"), и для этого элемента Span вы определяете свойство title.

ComboBox<MyEnum> comboBox = new ComboBox<>();
comboBox.setLabel("MyComboBox");
comboBox.setItems(MyEnum.values());
comboBox.setRenderer(new ComponentRenderer<>(item -> {
    Span span = new Span(item.name());
    span.getElement().setProperty("title", item.getValue());
    return span;
}));

enter image description here

...