3

モデルを使用してフォームにアタッチした Bean があり、正常に動作します。また、私は Bean のようなフィールドを持っていますMap<String, javax.mail.Address>。すべてのマップエントリが次のようになることを考慮して、モデルごとにこのフィールドをフォームにバインドするにはどうすればよいLabel: TextFieldですか?

前もって感謝します。

4

2 に答える 2

2

たぶん次のようなもの:

ListView<String> textAreasListView = new ListView<String>("someid", bean.map.keySet()) {
    @Override
    protected void populateItem(final ListItem<String> itemLang) {
        itemLang.add(new Label("label", itemLang.getModelObject()));
        Model<String> textModel = new Model<String>() {

            @Override
            public String getObject() {
                return bean.map.get(itemLang.getModelObject()).toString;
            }

            @Override
            public void setObject(String object) {
                bean.map.put(itemLang.getModelObject(), new Address(object));
            }
        };
        itemLang.add(new TextField<String>("email", textModel));
    }
};

これをフォームに追加します。

Address & String のカスタム コンバーターを追加すると、さらに改善されます。

于 2012-10-04T14:09:29.287 に答える
1

私は、あなたはそのような方法でそれをバインドできると思います:

TextField<Address> textField = new TextField<Address>("address",
        beanModel.<Address> bind("addressMap[addressKey]"), Address.class) {

    @SuppressWarnings("unchecked")
    @Override
    public <C> IConverter<C> getConverter(Class<C> type) {
        if (Address.class.isAssignableFrom(type)) {
            return (IConverter<C>) new AddressConverter();
        } else {
            return super.getConverter(type);
        }
    }
};
form.add(textField);

ここで、「addressMap」はマップ フィールドの名前、「addressKey」はマップ内のアドレス値のキーです。

AddressConverter クラスのリスト:

public class AddressConverter implements IConverter<Address> {

    public Address convertToObject(String string, Locale locale) {
        try {
            return new InternetAddress(string);
        } catch (AddressException e) {
            return null;
        }
    }

    public String convertToString(Address address, Locale locale) {
        return address.toString();
    }
}

もちろん、Address クラスのコンバーターは、ConverterLocator を使用してグローバルにアタッチできます。次のメソッドを Application クラスに追加するだけです。

@Override
protected IConverterLocator newConverterLocator() {
    ConverterLocator locator = new ConverterLocator();
    locator.set(Address.class, new AddressConverter());
    return locator;
}

そして、すべてのテキスト フィールドで getConverter() メソッドをオーバーライドする必要はありません。

于 2012-10-04T14:08:25.423 に答える