Vaadin 瓦丁7号:Tablefield工厂

Vaadin 瓦丁7号:Tablefield工厂,vaadin,vaadin7,Vaadin,Vaadin7,是否有一种方法可以实现与propertyId相关的特定字段的TableFactory接口? 我只得到一种类型的字段,因为我对所有表使用泛型类,并且我缺少布尔值复选框(groovy代码): 类DefaultTableFieldFactory实现TableFieldFactory{ @凌驾 公共字段createField(容器容器、对象项ID、对象属性ID、组件){ TextField t=新的TextField() 交换机(属性ID){ 案例“firstname”:t.setNullReprese

是否有一种方法可以实现与propertyId相关的特定字段的TableFactory接口? 我只得到一种类型的字段,因为我对所有表使用泛型类,并且我缺少布尔值复选框(groovy代码):

类DefaultTableFieldFactory实现TableFieldFactory{
@凌驾
公共字段createField(容器容器、对象项ID、对象属性ID、组件){
TextField t=新的TextField()
交换机(属性ID){
案例“firstname”:t.setNullRepresentation(“”);
案例“lastname”:t.setNullRepresentation(“”);
案例“移动”:t.setNullRepresentation(“”);
案例“电话”:t.setNullRepresentation(“”);
案例“电子邮件”:t.setNullRepresentation(“”);
默认:中断;
}
t、 设置宽度(“95px”)
返回t
}
}
因此,我需要使用这个类,在这个类之上,它意味着DefaultTableFieldfactory,以便在我的整个应用程序中将null表示为“”(而不是“null”)

我们的目标是在一个地方为我的自定义组件(超过30个)提供此空表示,我希望使用此类作为每个表的默认工厂,并像以前一样连接它:

def contacts = (Grails.get(FundService)).getAllContacts(fundId)
        def cContainer = new BeanItemContainer<Contact>(Contact.class,contacts)


        def t = new Table()
        t.containerDataSource = cContainer
        t.setTableFieldFactory(new DefaultTableFieldFactory())
def contacts=(Grails.get(FundService)).getAllContacts(fundId)
def cContainer=新BeanItemContainer(Contact.class,contacts)
def t=新表()
t、 containerDataSource=cContainer
t、 setTableFieldFactory(新的DefaultTableFieldFactory())

Vaadin提供了一个不映射的DefaultTableFieldFactory

  • 日期字段的日期
  • 将布尔值设置为复选框
  • 其他至文本字段
已在表上设置DefaultTableFieldFactory。因此,在您的情况下,如果您只想为布尔字段设置复选框,我不会实现自己的TableFieldFactory。下面是一个例子:

Table table = new Table();

table.addContainerProperty("text", String.class, "");
table.addContainerProperty("boolean", Boolean.class, false);
table.setEditable(true);

Object itemId = table.addItem();
table.getItem(itemId).getItemProperty("text").setValue("has accepted");
table.getItem(itemId).getItemProperty("boolean").setValue(true);
如果您确实需要拥有自己的TableFieldFactory,那么Vaadin建议:

您可以只实现TableFieldFactory接口,但是 建议您根据需要扩展DefaultFieldFactory 需要。在默认实现中,映射在 createFieldByPropertyType()方法(您可能希望查看 表和窗体的源代码)

在问题中给出的代码中,始终返回文本字段。对于缺少的复选框,您需要在特定情况下返回一个复选框

使用FieldFactorys时,不要忘记设置可编辑(true)


更多信息请参见5.16.3。编辑表中的值。

谢谢,但我已经知道什么是DefaultTableFactory,因为我正在代码中实现它。这里的目标是提供此工厂以在单个工厂中处理不同类型的字段,并将此模式应用于表的容器数据源(请参见上面修改的代码)@ludo_rj,然后查看createFieldByType()Vaadin提供的DefaultFieldFactory类中的方法,该类在适当时返回一个复选框。是的,这就是我要查找的:)因为DefaultFieldFactory.createFieldByPropertyType是静态的,它不能被重写,所以它需要在TableFieldFactory中正确实现外代码。@ludo_rj我在我的回答,如果你仔细看的话。
Table table = new Table();

table.addContainerProperty("text", String.class, "");
table.addContainerProperty("boolean", Boolean.class, false);
table.setEditable(true);

Object itemId = table.addItem();
table.getItem(itemId).getItemProperty("text").setValue("has accepted");
table.getItem(itemId).getItemProperty("boolean").setValue(true);