使用vaadin下拉组件的setItemCaptionPropertyId的实用程序方法

时间:2015-11-17 07:15:42

标签: vaadin

我正在使用组合框,并且我设置了AttributeDisplayType类类型的容器数据源。

typeBeanItemContainer = new MyBeanItemContainer<AttributeDisplayType>(AttributeDisplayType.class);
typeComboBox.setContainerDataSource(typeBeanItemContainer);
beanFieldGroup.bind(typeComboBox, propertyName(beanFieldGroup.proxy().getClientAttribute().getAttributeDisplayType()));

但我想本地化组合框中显示的值。我不想在AttributeDisplayType周围创建包装器并将其用作容器数据源。

有没有办法可以使用setItemCaptionPropertyId并使用一些实用工具方法对组合框中显示的值进行本地化,如下所示

typeComboBox.setItemCaptionPropertyId(getLocalizedText(propertyName(Lambda.on(AttributeDisplayType.class).getDisplayTypeName().toLowerCase())));

typeComboBox.setItemCaptionPropertyId(getLocalizedText(propertyName(Lambda.on(AttributeDisplayType.class).getDisplayTypeName().toLowerCase())));

public String getLocalizedText(String displayTypeName) {
        return resouceBundle.getKey(displayTypeName);
}

我无法在现有AttributeDisplayType中添加我的字段或方法,因为资源包不适用于该类。

是否可以创建包装器并使用method/field作为setItemCaptionPropertyId

3 个答案:

答案 0 :(得分:2)

typeComboBox.setItemCaptionGenerator(new ItemCaptionGenerator() {
            @Override
            public String getItemCaption(AbstractSelect source, Object itemId) {
                AttributeDisplayType type = (AttributeDisplayType) itemId;
                return getText(type.getDisplayTypeName().toLowerCase());
            }
});

getText是进行本地化的方法,解决方案非常简单,不确定为什么我会以困难的方式思考。感谢我的同事。

答案 1 :(得分:0)

最简单的解决方案是使用GeneratedPropertyContainer

您甚至可以考虑创建一般的本地化容器。也许与此类似(不是完整的实现,但它给你的想法):

endl

然后您可以在 public class LocalizedContainer extends GeneratedPropertyContainer { public LocalizedContainer(Indexed container) { super(container); Collection<?> containerPropertyIds = container.getContainerPropertyIds(); for (final Object containerPropertyId : containerPropertyIds) { if (containerPropertyId instanceof String) { String localizedPropertyId = containerPropertyId + ".localized"; addGeneratedProperty(localizedPropertyId, new PropertyValueGenerator<String>() { @Override public String getValue(Item item, Object itemId, Object propertyId) { Object value = item.getItemProperty(containerPropertyId).getValue(); return getLocalizedValue(value); } @Override public Class<String> getType() { return String.class; } }); } } } private String getLocalizedValue(Object value) { // Do localization here return String.valueOf(value); } } 上使用setItemCaptionPropertyId("yourpropertyid.localized")并将您的容器包装在ComboBox内。

答案 2 :(得分:0)

Viritin add-on添加到您的项目中。它是TypedSelect组件(允许使用ComboBox作为底层实现),包含类似于Archana Mundane示例中的API,但只调用CaptionGenerator并更好地输入。使用示例:

    // Better typed alternative for Vaadin select
    final TypedSelect<Person> typedSelect = new TypedSelect<Person>();
    // Uses "NativeSelect" as impl. by default, but all core select types are 
    // supported. E.g.: withSelectType(ListSelect.class);

    // Typed API for setOptions makes its usage easier to figure out where are we 
    // selecting from. Note that its "fluent" so you can chain it directly into
    // constrcutor as well.
    typedSelect.setOptions(options);

    // for most objects you want to customize the caption text. Again, you
    // can use chaind invocation and you'll use lambdas in you java 8 project.
    typedSelect.setCaptionGenerator(new CaptionGenerator<Person>() {

        @Override
        public String getCaption(Person option) {
            return option.getFirstName() + " " + option.getLastName();
        }
    });