Vaadin Grid TextField for Boolean StringToBooleanConverter

时间:2018-03-04 01:27:14

标签: java vaadin

在Vaadin Grid(8.1.0)中处理内联编辑功能时,我创建了bean并使用Grid中的setItems方法填充所有行。

但是当我双击一行来编辑它时,出现了异常。我以为我已经使用TextField正确绑定了bean的属性类型,但它仍然抛出异常。

以下是我的手动绑定代码,它找到了我想要用于编辑的Textfield的布尔属性。

    Binder<RegistrationRecord> needFancialFlagBinder = new Binder<>(RegistrationRecord.class);
    needFancialFlagBinder .forField ( needFancialFlagField ) 
      .withNullRepresentation( "" )
      .withConverter (new StringToBooleanConverter("Need financial flag must be true or false!"))
      .bind ( RegistrationRecord:: isNeedFancialFlag, RegistrationRecord:: setNeedFancialFlag);

以下代码将TextField与Grid中的列相关联。

    registrationGrid.getColumn("needFancialFlag")
    .setEditorComponent(needFancialFlagField)   
    .setExpandRatio(1); 

以下是例外情况的一部分。 StringToBooleanConverter只负责从String转换为Boolean而不是相反吗?我应该用什么方法用于另一个方向?

    java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
    at com.vaadin.ui.AbstractTextField.setValue(AbstractTextField.java:47) ~[vaadin-server-8.1.0.jar:8.1.0]
    at com.vaadin.data.Binder$BindingImpl.initFieldValue(Binder.java:893) ~[vaadin-server-8.1.0.jar:8.1.0]
    at com.vaadin.data.Binder$BindingImpl.access$100(Binder.java:766) ~[vaadin-server-8.1.0.jar:8.1.0]
    at com.vaadin.data.Binder.lambda$readBean$2(Binder.java:1386) ~[vaadin-server-8.1.0.jar:8.1.0]
    at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_121]

1 个答案:

答案 0 :(得分:0)

因此,提出的问题不充分。我想使用TextField在Grid的一列中编辑一个布尔模型成员,并且在该过程的某个地方提出了一个更好的想法。我应该使用CheckBox,而不是使用TextField。因此,解决方案转过来,下面是正确的代码。注意这是Vaddin 8.1.0。 (我发现Vaadin很快就改变了很多版本。)

    private void addBooleanPropertyColumn(Grid theGrid, String propertyName, String caption) {
    CheckBox bBox = new CheckBox();  
    Column<RegistrationRecord, String> adultFlagColumn = theGrid.addColumn(record->
        "<span class=\"v-checkbox v-widget\"><input type=\"checkbox\" id=\"my-uid-1\" " + returnChecked(propertyName, record) + "  > <label for=\"my-uid-1\"></label> </span>",
        new HtmlRenderer());
    adultFlagColumn.setId(propertyName)
    .setCaption(caption)
    .setEditorComponent(bBox) 
    .setExpandRatio(1); 
}  

概念是网格中的列支持渲染器,验证器和编辑器的关联。一旦你了解到这一点,就会变得简单明了。

我没有使用验证器,因为模型字段只是一个布尔值。值得注意的是,编辑器组件必须具有关联的属性,因此setID是一个方便的setter。