2011-11-25 5 views
2

В настоящее время я работаю над проектом с использованием vaadin .. до сих пор все работает, за исключением локализации абстрактных компонентов выбора (группа опций, выпадающих списков и выпадающих списков и т. Д.), В которых элементы выбора относятся к типам перечислений. Я использовал подход с использованием контейнеров:Локализация vaadin для перечислений

private Container buildFundTransferTypeContainer() { 
     Container container = new IndexedContainer(); 
     container.addContainerProperty("label", String.class, ""); 
     container.addContainerProperty("value", FundTransferType.class, null); 
     for (FundTransferType type : FundTransferType.values()) { 
      Object id = container.addItem(); 
      container.getContainerProperty(id, "label").setValue(
        MessageResource.getLocalizedString(type.name())); 
      container.getContainerProperty(id, "value").setValue(type); 
     } 
     return container; 
    } 

то поле устанавливается:

fundTransferTypeField.setContainerDataSource(buildFundTransferTypeContainer()); 
fundTransferTypeField.setItemCaptionPropertyId("label"); 

так, что свойство «метка» будет использоваться для отображения. до сих пор это работает с точки зрения отображения локализованных значений в браузере, однако я получаю

com.vaadin.data.Buffered$SourceException 
... 
Caused by: com.vaadin.data.Buffered$SourceException 
    at com.vaadin.ui.AbstractField.commit(AbstractField.java:261) 
    at com.vaadin.ui.Form.commit(Form.java:339) 
    ... 34 more 
Caused by: com.vaadin.data.Property$ConversionException: java.lang.NoSuchMethodException: net.novenix.tgsmango.core.enums.FundTransferType.<init>(java.lang.String) 
    at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:697) 
    at com.vaadin.data.util.MethodProperty.setValue(MethodProperty.java:666) 
    at com.vaadin.ui.AbstractField.commit(AbstractField.java:256) 
    ... 35 more 
Caused by: java.lang.NoSuchMethodException: com.sample.project.core.enums.FundTransferType.<init>(java.lang.String) 
    at java.lang.Class.getConstructor0(Class.java:2706) 
    at java.lang.Class.getConstructor(Class.java:1657) 
    at com.vaadin.data.util.MethodProperty.convertValue(MethodProperty.java:690) 
    ... 37 more 

при фиксации называется на форме. Как следует обрабатывать локализованные значения для этих компонентов vaadin. Спасибо за ответы

+0

Так оно работает, если вы не локализуете ярлык «Строки»? Можете ли вы показать мне свое определение FundTransferType? – miq

+0

Для этого вам нужен ваш класс FundTransferType. Стек-стек, кажется, указывает на ошибку в этом классе – Marthin

+0

Спасибо за ваши ответы .. я смог решить эту проблему некоторое время назад. и я сделал это, добавив фактическое enum (field.addItem (enum1)), а затем установил заголовок элемента с локализованной строкой (field.setItemCaption (enum1, Localizer.localize (enum1.name())) .. снова спасибо много. – geneqew

ответ

3

Вот решение, которое я использовал. на поле или фабрике, когда каждый раз, когда вы создаете поле,

ComboBox accountStatusChoice = new ComboBox(); 

accountStatusChoice.setCaption(MessageResource.getLocalizedString("caption.accountStatus")); 
accountStatusChoice.setRequired(true); 
accountStatusChoice.setRequiredError(MessageResource.getLocalizedString("error.required.accountStatus")); 
accountStatusChoice.setImmediate(true); 

for (AccountStatus accountStatus : AccountStatus.values()) { 
    accountStatusChoice.addItem(accountStatus); 
    accountStatusChoice.setItemCaption(accountStatus, MessageResource.getLocalizedString(accountStatus.name())); 
} 

return accountStatusChoice; 

в этом коде MessageResource.getLocalizedString («ResourceKey») мой Util класс, чтобы получить локализованные строки через пакет ресурсов. при добавлении содержимого поля со списком (или любого другого компонента abstractSelect, который вы хотите использовать), используйте addItem, чтобы добавить значение объекта, которое вы хотите использовать, и используйте setItemCaption (itemId, captionString), чтобы установить надпись, видимую пользователю.

beanItem, который вы будете использовать для своей формы, просто должен иметь свойство Enum (в данном случае переменной экземпляра AccountStatus). когда коммит вызывается в форме, он больше не будет вызывать com.vaadin.data.Buffered $ SourceException.

Смежные вопросы