У меня есть сетка в приложении Vaadin. Для одного столбца я хочу применить DateRenderer. Возникает следующая проблема:

enter image description here

Что я делаю не так? Пример из книги Ваадина делает это так же, как и я.

ОБНОВИТЬ

Я получил тот же результат, что и ответы на этот вопрос. Мой рабочий код (с несколькими рендерерами):

final Grid<Signature> grid = new Grid<>(Signature.class);
grid.setSelectionMode(Grid.SelectionMode.SINGLE);
grid.setSizeFull();
grid.setColumns();
grid.addColumn("type").setCaption(bundle.getString("type"));
grid.addColumn("filename").setCaption(bundle.getString("filename"));
grid.addColumn("createdTime", new DateRenderer("%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS"))
        .setCaption(bundle.getString("creationDate"));
grid.addColumn(this::createCertificateLabel, new ComponentRenderer())
        .setCaption(bundle.getString("certificate"))
        .setDescriptionGenerator((DescriptionGenerator<Signature>) signature -> bundle.getString("certificateSerialNumber"));
grid.addColumn(this::createLink, new ComponentRenderer())
        .setCaption(bundle.getString("action"));
2
David Artmann 14 Мар 2018 в 13:37

2 ответа

Лучший ответ

Посмотрим на подпись: Column<T, ?> getColumn(String columnId). На самом деле он не знает, какой параметр второго типа у вашего столбца, потому что это может быть что угодно. Таким образом, применение средства визуализации методом Column<T, V> setRenderer(Renderer<? super V> renderer) предполагает предполагаемое средство визуализации типа Renderer<? super ?>, что, как я думаю, не может быть выполнено.

Решение 1. Приведите столбец к соответствующему типу, например

((Grid.Column<YourBean, Date>) grid.getColumn("xyz")).setRenderer(new DateRenderer())

Это даст вам предупреждение о компиляции из-за непроверенного приведения. Я думаю, вы также можете выполнить приведение к Column без аргументов типа, но это тоже даст вам предупреждения.

Решение 2: Как уже указывал avix в своем ответе, передать средство визуализации в методе addColumn проще.

grid.addColumn(item -> someExpressionThatReturnsDate, new DateRenderer());
1
Steffen Harbich 14 Мар 2018 в 12:54

Вы можете сделать это с помощью функции addColumn(), которая принимает AbstractRenderer, а setRenderer() исключает средство визуализации.

grid.addColumn( "myColumn", new DateRenderer( ... ) )

Думаю, вы также можете попробовать сделать это таким образом, но я его не тестировал (поскольку DateRenderer реализует Renderer<Date>):

column.setRenderer( (Renderer)new DateRenderer( ... ) );
2
Dawid Fieluba 14 Мар 2018 в 11:45