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