Как визуализировать LocalDateRenderer для сетки в Vaadin 8

Я понимаю, что Vaadin 8.1.0 будет включать новый LocalDateRenderer для работы с новым date LocalDate, но тем временем я пытаюсь настроить свой собственный LocalDateRenderer. У меня это в основном работает, потому что все подключено, но на основе документации мне нужно настроить AbstractRendererConnector, но такого класса нет...

Весь следующий код находится в моем основном классе пользовательского интерфейса (для целей тестирования):

private void setupGrid(Grid<Dog> grid)
{
    grid.addColumn(dog -> dog.getBirthday(), new LocalDateRenderer()).setCaption("Birthday");
}

class LocalDateRenderer extends AbstractRenderer<Object, LocalDate>
{
    public LocalDateRenderer() 
    {
        super(LocalDate.class, "");
    }

    @Override
    public JsonValue encode(LocalDate localDate) 
    {
        return encode(DateTimeFormatter.ofPattern("MMM dd, YYYY").format(localDate), String.class);
    }
}

Я подтвердил, что LocalDateRenderer вызывается путем добавления операторов регистрации, однако в сетке значения не отображаются. Если я использую тот же код, но вместо LocalDate я делаю это для Long, но вместо extends AbstractRenderer я расширяю NumberRenderer своим собственным кодом, тогда это работает.

Это привело меня к документации , где я нужно настроить Renderer с AbstractRendererConnector, но всякий раз, когда я пытаюсь сделать это, я получаю сообщение об ошибке компилятора, говорящее, что AbstractRendererConnector не может быть преобразован в тип. И тут конечно у меня есть ряд ошибок компилятора (в коде ниже). Мой код для этого (все еще в основном классе пользовательского интерфейса):

@Connect(LocalDateRenderer.class)
class LocalDateRendererConnector extends AbstractRendererConnector<LocalDate> 
{
    @Override
    public LocalDateRenderer getRenderer() 
    {
        return (LocalDateRenderer) super.getRenderer();
    }
}

Мы будем очень признательны за любую помощь в том, как связать его, чтобы он отображал мои фактические даты. Спасибо.

Также в документации неясно, какой класс есть какой, когда они ссылаются на TextRenderer, поскольку они используют одно и то же имя для разных вещей...


person Stephane Grenier    schedule 28.03.2017    source источник
comment
К вашему сведению, Vaadin Framework 8.1.0 Alpha 2 доступна. Вы можете заглянуть в их исходный код.   -  person Basil Bourque    schedule 29.03.2017
comment
Я пытался собрать аналогичный рендерер, но через несколько часов сдался и решил подождать 8.1. Мне не к спеху, поэтому подожду 8.1. чтобы выйти официально, и показать мои даты как строки (варварские, я знаю..) между тем..   -  person Jukka Nikki    schedule 29.03.2017
comment
Просто ссылка на задачу, которая содержит обсуждение темы github.com/vaadin/framework/ вопросы/8377#issuecomment-290049482   -  person Jukka Nikki    schedule 29.03.2017
comment
Если вы просто хотите отобразить их в каком-то определенном формате, у вас может быть временный обходной путь до 8.1.0, используя converters. Если вы хотите сделать рендер по какой-то другой причине, пожалуйста, игнорируйте мой комментарий   -  person Morfic    schedule 29.03.2017
comment
Я посмотрел на код и сдался через несколько часов. Не могу найти недостающую ссылку...   -  person Stephane Grenier    schedule 29.03.2017
comment
ОБНОВЛЕНИЕ: Vaadin 8.1 поставляется с визуализаторами столбцов Vaadin Grid для LocalDate, LocalTime и LocalDateTime. Таинственным образом они не реализовали средства визуализации для более полезных классов Instant, OffsetDateTime и ZonedDateTime java.time. Вы можете довольно легко реализовать такие рендереры самостоятельно в виде надстройки, написав три файла классов. См. мой вопрос и мой ответ .   -  person Basil Bourque    schedule 05.09.2017
comment
См. мой проект TimeColumnRenderers на BitBucket для классов InstantRenderer, OffsetDateTimeRenderer и ZonedDateTimeRenderer.   -  person Basil Bourque    schedule 19.10.2017


Ответы (1)


Если ваш компилятор не может преобразовать AbstractRendererConnector<T> в тип, у вас должна отсутствовать зависимость. Если вы используете Maven, вы можете добавить следующую зависимость, предполагая, что у вас есть vaadin-bom в разделе <dependencyManagement>.

    <dependency>
        <groupId>com.vaadin</groupId>
        <artifactId>vaadin-client</artifactId>
    </dependency>

Этот артефакт не включен по умолчанию в большинство архтетипов Ваадина.

Также будьте осторожны: есть два интерфейса Renderer, один в com.vaadin.client.renderers и один в com.vaadin.ui.renderers. Ваш ковариантный возврат в LocalDateRendererConnector.getRenderer() не будет работать, потому что AbstractRendererConnector<T> реализует другой интерфейс Renderer.

person Alejandro C De Baca    schedule 30.03.2017