代码之家  ›  专栏  ›  技术社区  ›  David Artmann

Vaadin网格日期渲染器不适用

  •  2
  • David Artmann  · 技术社区  · 7 年前

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

    enter image description here

    我做错了什么?这个 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"));
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Dawid Fieluba    7 年前

    你可以在 addColumn() 采取的功能 AbstractRenderer 虽然 setRenderer() 例外情况 Renderer

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

    我想你也可以试着这样做,但我还没有测试过(正如 DateRenderer 机具 Renderer<Date> ):

    column.setRenderer( (Renderer)new DateRenderer( ... ) );
    
        2
  •  1
  •   Steffen Harbich    7 年前

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