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 DateFieldObject 代表 ComboBoxes)。转换器通常用于在表示类型(例如 UI 上值的文本表示)与其内部模型类型(例如日期、货币值或自定义 JavaBean)之间进行转换。因此,例如,如果您有一个 Label,您可以使用 StringToDateConverter 来正确显示一个 Date 对象,该对象已被设置为 Label 的值,在正确本地化的方式。

select 组件(例如 ComboBox)怎么样?这里的类型 TObject。 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