2011-11-25 1 views
2

현재 vaadin ..을 사용하는 프로젝트에서 작업 중입니다. 선택 항목이 enum 유형에서 오는 추상 선택 구성 요소 (옵션 그룹, 콤보 박스, 드롭 다운 등)를 제외한 모든 것이 작동합니다. 다음 필드가 설정되어enums에 대한 현지화

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 클래스가 필요합니다. stacktrace는 해당 클래스의 오류를 가리키는 것 같습니다 – Marthin

+0

답장을 보내 주셔서 감사합니다. 나는 얼마 전이 문제를 해결할 수있었습니다. 그리고 실제 enum (field.addItem (enum1))을 추가 한 다음 지역화 된 문자열 (item.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")는 자원 번들을 통해 지역화 된 문자열을 검색하는 내 폴더의 유틸리티 클래스입니다. 콤보 상자의 내용 (또는 사용하려는 abstractSelect 구성 요소)을 추가 할 때 addItem을 사용하여 사용할 객체 값을 추가하고 setItemCaption (itemId, captionString)을 사용하여 사용자가 볼 수있는 캡션을 설정합니다.

양식에 사용할 beanItem에는 Enum 속성 (이 경우 AccountStatus 인스턴스 변수)이 있어야합니다. 폼에서 커밋이 호출되면 더 이상 com.vaadin.data.Buffered $ SourceException을 throw하지 않습니다.