2015-06-11 80 views
4

我做了一个转换器:VAADIN:为什么我无法将转换器设置为ComboBox?

public class BooleanToDateConverter implements Converter<Boolean, Date> { 
    private static final long serialVersionUID = 1L; 

    @Override 
    public Date convertToModel(Boolean value, Class<? extends Date> targetType, Locale locale) 
      throws com.vaadin.data.util.converter.Converter.ConversionException { 
     if (value == true) { 
      return new Date(); 
     } else { 
      return null; 
     } 
    } 

    @Override 
    public Boolean convertToPresentation(Date value, Class<? extends Boolean> targetType, Locale locale) 
      throws com.vaadin.data.util.converter.Converter.ConversionException { 
     if (value == null) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

    @Override 
    public Class<Date> getModelType() { 
     return Date.class; 
    } 

    @Override 
    public Class<Boolean> getPresentationType() { 
     return Boolean.class; 
    } 
} 

然后,我有一个Vaadin组合框myComboBox 我尝试我的转换器设置为它:

myComboBox.setConverter(new BooleanToDateConverter()); 

然后我得到在Eclipse中的错误说:

The method setConverter(Class<?>) in the type AbstractField<Object> is not applicable for the arguments (BooleanToDateConverter) 

但是,我看到其他转换器被类似地使用,他们没有得到错误。为什么?

回答

14

您的代码无法编译,因为ComboBox类中没有setConverter()方法可用于您的自定义转换器。让我解释一下如何在选定组件上使用转换器,以及您在ComboBox上设置转换器的特定方法签名背后的想法。

ComboBox提供的setConverter()两个重载版本:

  • setConverter(Class<?> datamodelType):设置给定的数据模型类型预先注册的转换器
  • setConverter(Converter<Object, ?> converter):设置一个具体的转换器实例

两者的这些方法实际上是从类AbstractField<T>继承的,其中T是由字段管理的数据类型(例如Strings for tex t场,DateDateField,ObjectComboBoxes)。转换器通常用于在表示类型(如UI上的值的文本表示)与其内部模型类型(如日期,货币值或自定义JavaBean)之间进行转换。因此,例如,如果您有Label,则可以使用StringToDateConverter以正确本地化的方式正确显示Date对象,该对象已被设置为Label的值。

这是如何选择组件,如ComboBox?这里的类型TObject。实际选择组件的数据类型表示来自底层容器数据源的所选项目的项目ID。因此,如果您使用BeanItemContainer作为ComboBox的数据源,那么容器的项目ID(以及因此所选的ComboBox的值)本身就是包含的JavaBean对象。项目ID的具体类型取决于所使用的容器实现。因此,选择的组件是值为ObjectField组件。换句话说,选择组件使用Object作为演示文稿类型。

这就是为什么您只能在选择组件上设置一个转换器实例,其通用PRESENTATION类型为Object。模型类型可以自由选择。这也解释了为什么您无法设置演示文稿类型为Boolean和模型类型Date的转换器为ComboBox - ComboBox不使用Boolean作为演示文稿类型。

我写了一篇关于Vaadin FieldGroups的博客文章,它也提供了一个很好的示例,用于在ComboBox上使用Converter<Object, ?>的用例。你可以在http://blog.oio.de/2014/04/25/select-nested-javabeans-vaadin-fieldgroup/找到这篇文章。

我不知道你想用你的代码实现什么,因为演示文稿类型为Boolean和模型类型为Date的转换器没有多大意义。我只能猜测你想要实现某种决策逻辑,也许可以决定是否设置了日期。在这种情况下,你需要采取不同的方法。

仅供参考,请看Book of Vaadin on Converters

+0

我决定稍后以不同的方式解决这个问题。我在视图正在处理的实体bean中将决策逻辑创建为瞬态方法。对我和其他许多人来说,很好的答案仍然很有帮助。 –

+0

TL; DR:只能在通用PRESENTATION类型为Object的select组件上设置转换器实例 – ropo

相关问题