Vaadin Grid DateRenderer 不适用

Vaadin Grid DateRenderer not appliable

我在 Vaadin 应用程序中有一个网格。对于一列,我想应用 DateRenderer。 出现以下问题:

我做错了什么? Vaadin 书中的 example 和我一样在做。

更新

我得到了与这个问题的答案相同的结果。我的工作代码(有几个渲染器):

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

您可以在需要 AbstractRenderer while setRenderer() excepts Renderer.

addColumn() 函数中执行此操作
grid.addColumn( "myColumn", new DateRenderer( ... ) )

我想你也可以尝试这样做,但我还没有测试过(因为 DateRenderer 实现了 Renderer<Date>):

column.setRenderer( (Renderer)new DateRenderer( ... ) );

我们来看看签名: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());