Создание ярлыков для переключателей, поддерживаемых перечислением, в веб-приложении Vaadin 14 - PullRequest
2 голосов
/ 11 февраля 2020

В веб-приложении Vaadin Flow 14.1, используя Java 13, я определил перечисление (см. Учебное пособие ) для поддержки своих радиокнопок (RadioButtonGroup). ).

private enum FilterOrNot
{
    SHOW_ALL( "Show all" ), FILTER( "Filter" );  // Elements defining our enum. Passing our desired display name string to the constructor.
    private String displayName;

    // Constructor
    FilterOrNot ( String displayName ) { this.displayName = displayName; }

    String getDisplayName ( ) { return this.displayName; }
}

Обратите внимание на метод getDisplayName для предоставления текста, который будет использоваться в качестве меток для моих радио-кнопок.

Я успешно определил свои радио-кнопки, поддерживаемые этим enum.

private RadioButtonGroup < FilterOrNot > showAllOrFilter ;
…
showAllOrFilter = new RadioButtonGroup <>() ;
showAllOrFilter.setItems( FilterOrNot.SHOW_ALL , FilterOrNot.FILTER ) ;

Эти переключатели успешно отображаются на экране. Но их заголовками по умолчанию являются имена всех заглавных букв объектов enum: «SHOW_ALL» и «FILTER». Я хочу, чтобы надписи отображались в виде текста со смешанным регистром «Показать все» и «Фильтр».

➥ Как заставить мой виджет переключателей вызывать getDisplayName вспомогательного перечисления и использовать возвращенный текст в качестве их маркировки?

Я видел класс ComponentRenderer, который можно назначить с помощью RadioButtonGroup::setRenderer. Я предполагаю, что это решение. Но я не могу понять синтаксис правильно. Я подозреваю, что в угловых скобках указаны неправильные типы обобщения, но я не совсем уверен. В руководстве есть только несколько кратких упоминаний ComponentRenderer, поэтому я не уверен, как использовать этот класс.

showAllOrFilter.setRenderer(
        new ComponentRenderer < RadioButtonGroup, FilterOrNot >( ( FilterOrNot filterOrNot ) -> {
           return filterOrNot.getDisplayName() ;
        })
);

1 Ответ

2 голосов
/ 11 февраля 2020

Как обсуждалось в комментариях к вопросу…

RadioButtonGroup не хватает setItemLabelGenerator

В виджете RadioButtonGroup отсутствует удобный метод setItemLabelGenerator, который можно увидеть в аналогичных виджетах в Vaadin 14.1. , Например, Select:setItemLabelGenerator.

См. (И проголосуйте за!) Запрос на добавление функции в этот тикет с просьбой добавить такой метод: Добавить setItemLabelGenerator сокращение от RadioButtonGroup # 107

Обходной путь: Звоните setRenderer, передавая TextRenderer

Пока однажды эта функция не появится, я предлагаю вам использовать TextRenderer объект.

На вашем RadioButtonGroup виджете с именем showAllOrFilter, позвоните setRenderer и передайте TextRenderer из ссылка на метод для вашего перечисления getDisplayName.

showAllOrFilter                         // Your `RadioButtonGroup` widget.
.setRenderer( 
    new TextRenderer <>( 
        FilterOrNot :: getDisplayName   // Method reference.
    ) 
);

Итак, ваш код будет выглядеть так:

showAllOrFilter = new RadioButtonGroup <>();
showAllOrFilter.setItems( FilterOrNot.SHOW_ALL , FilterOrNot.FILTER );
showAllOrFilter.setValue( FilterOrNot.SHOW_ALL );
showAllOrFilter.setRenderer( new TextRenderer <>( FilterOrNot :: getDisplayName ) );
...