我做了一个转换器:
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 ComboBox myComboBox
我尝试将我的转换器设置为:
myComboBox.setConverter(new BooleanToDateConverter());
然后我在 Eclipse 中收到一条错误消息:
The method setConverter(Class<?>) in the type AbstractField<Object> is not applicable for the arguments (BooleanToDateConverter)
但是,我已经看到其他转换器的使用方式类似,并且没有出现错误。为什么?
最佳答案
您的代码无法编译,因为类 setConverter()
上没有适合您的自定义转换器的 ComboBox
方法。让我解释一下如何在选择的组件上使用转换器,以及您找到的用于在 ComboBox
上设置转换器的特定方法签名背后的想法是什么。ComboBox
提供了setConverter()
的两个重载版本:
setConverter(Class<?> datamodelType)
: 为给定的数据模型类型 setConverter(Converter<Object, ?> converter)
: 设置一个具体的转换器实例 这两种方法实际上都继承自
AbstractField<T>
类,其中 T
是字段管理的数据类型(例如文本字段的字符串,Date
的 DateField
,Object
的 ComboBoxes
)。转换器通常用于在表示类型(例如 UI 上值的文本表示)与其内部模型类型(例如日期、货币值或自定义 JavaBean)之间进行转换。因此,例如,如果您有 Label
,则可以使用 StringToDateConverter
以正确本地化的方式正确显示 Date
对象,该对象已设置为 Label
的值。ComboBox
等选择组件如何?这里的 T
类型是 Object
。选择组件的数据类型实际上是 表示来自底层容器数据源 的所选项目的项目 ID。因此,如果您使用 BeanItemContainer
作为 ComboBox
的数据源,则容器的项目 ID(以及 ComboBox
的选定值)就是所包含的 JavaBean 对象本身。项目 ID 的具体类型取决于所使用的容器实现。因此,选择组件是值类型为 Field
的 Object
组件。换句话说,选择组件使用 Object
作为表示类型。这就是为什么您只能在通用
PRESENTATION
类型为 Object
的选择组件上设置转换器实例。模型类型可以自由选择。这也解释了为什么不能在 Boolean
上设置具有表示类型 Date
和模型类型 ComboBox
的转换器——ComboBox
不使用 Boolean
作为表示类型。我写了一篇关于 Vaadin
FieldGroups
的博客文章,它也为何时在 Converter<Object, ?>
上使用 ComboBox
的用例提供了一个很好的例子。您可以在 http://blog.oio.de/2014/04/25/select-nested-javabeans-vaadin-fieldgroup/ 上找到这篇文章。我不知道你想用你的代码实现什么,因为
Boolean
的表示类型和 Date
的模型类型之间的转换器没有多大意义。我只能猜测您想实现某种决策逻辑,也许是决定是否已设置日期?在这种情况下,您需要采取不同的方法。作为引用,请查看 Book of Vaadin on Converters 。
关于combobox - VAADIN : Why I can't set a converter to a ComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30779247/