2011-11-25 2 views
2

現在、vaadin ..を使用しているプロジェクトで作業しています。選択項目は列挙型からの抽象的な選択コンポーネント(オプショングループ、コンボボックス、ドロップダウンなど)のローカライズ以外はすべて動作しています。私はコンテナを使用してのアプローチを使用:プロパティ「標識」の表示に使用されるようにenumのためのvaadinのローカライゼーション

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

:そのフィールドがで設定されている

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; 
    } 

。これまでのところ、これはブラウザでローカライズされた値を表示するという点で動作しているコミットをフォームに呼び出されたときに、しかし、私は

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」)は、リソースバンドルを経由してローカライズされた文字列を取得するために私のutilのクラスです。コンボボックスの内容(または使用するabstractSelectコンポーネント)を追加するときは、addItemを使用して使用するオブジェクト値を追加し、setItemCaption(itemId、captionString)を使用して、ユーザーに表示されるキャプションを設定します。

フォームに使用するbeanItemには、単にEnumプロパティ(この場合はAccountStatusインスタンス変数)が必要です。コミットがフォーム内で呼び出されると、com.vaadin.data.Buffered $ SourceExceptionはスローされなくなります。

関連する問題