combobox - VAADIN : Why I can't set a converter to a ComboBox?

标签 combobox type-conversion converter vaadin7

我做了一个转换器:

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 是字段管理的数据类型(例如文本字段的字符串,DateDateFieldObjectComboBoxes )。转换器通常用于在表示类型(例如 UI 上值的文本表示)与其内部模型类型(例如日期、货币值或自定义 JavaBean)之间进行转换。因此,例如,如果您有 Label,则可以使用 StringToDateConverter 以正确本地化的方式正确显示 Date 对象,该对象已设置为 Label 的值。
    ComboBox 等选择组件如何?这里的 T 类型是 Object 。选择组件的数据类型实际上是 表示来自底层容器数据源 的所选项目的项目 ID。因此,如果您使用 BeanItemContainer 作为 ComboBox 的数据源,则容器的项目 ID(以及 ComboBox 的选定值)就是所包含的 JavaBean 对象本身。项目 ID 的具体类型取决于所使用的容器实现。因此,选择组件是值类型为 FieldObject 组件。换句话说,选择组件使用 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/

    相关文章:

    c# - ComboBox Selected Value - 与字符串匹配的值

    html - 如何修改选择框的长度

    c++ - 是否可以将常规指针转换为指向类字段的指针

    .net - 手动将IPv4转换为IPv6

    c# - 选择组合框文本

    javascript - 这是什么 comboBox 或 dropDownList?

    c# - 灵活使用 IDictionary(带接口(interface))

    ios - Swift 无法将表达式的类型 '()' 转换为 CGRect 类型

    java - 将 Java 转换为 Objective-C

    c - 用C中的while替换for循环