我正在使用组合框,并且我设置了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
?
答案 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();
}
});