[Wicket-ja-user 262] Re: MultipleChoiceコンポーネントでモデルにCollectionを使わずStringを使いたい

アーカイブの一覧に戻る

Tsutomu Yano benbr****@mac*****
2008年 12月 8日 (月) 03:22:10 JST


すみません、あとからやってることが目的と違うことに気がつきました。
バックエンドのデータがカンマ区切りの文字列なんですね。それをもとにチェックボックスが表示され、
更新内容もそのカンマ区切り文字列に反映しないといけないですね。

次のモデルであれば、カンマ区切りの文字列の入ったプロパティを指定することで、それをもとに
チェックボックスを表示したり、プロパティを更新したりできます。

public static class CommaSeparatateStringModel implements IModel<Collection<String>> {
	PropertyModel<String> stringModel;
	Collection<String> collection = new ArrayList<String>();

	public CommaSeparatateStringModel(Object target, String property) {
		this.stringModel = new PropertyModel<String>(target, property);
	}

	public Collection<String> getObject() {
		collection.clear();
		String innerValue = stringModel.getObject();
		if(innerValue != null) {
			collection.addAll(Arrays.asList(innerValue.split(",")));
		}
		return collection;
	}

	public void setObject(Collection<String> object) {
		if(object == null || object.size() == 0) {
			stringModel.setObject("");
			collection.clear();
		} else {
			String innerValue = StringUtils.join(object, ",");
			stringModel.setObject(innerValue);
			collection.clear();
			collection.addAll(object);
		}
	}

	public void detach() {
		stringModel.detach();
	}
}


 IModel<Collection<String>>の実装クラスを作って、処理をすべて内部に持っている
PropertyModel<String>に委譲するようにしました。プロパティ内容はカンマ区切りの文字列です。
 とうぜん、文字列の内容が変わればチェックボックスにも反映されます。文字列の内容から動的に
Collection<String>を作っています。

 お試しください。


On 2008/12/08, at 2:54, Tsutomu Yano wrote:

> こんばんは。
>
> 次のようなIModel実装を使って、CheckBoxMultipleChoiceのモデルとしてPropertyModelの代わりに使うと
> うまくいきました。
>
> PropertyModel<Collection<String>>を継承して、値がセットされるときに別に用意した内部の
> PropertyModel<String>にもカンマ区切りの文字列をセットするようにしただけですね。
>
> コンストラクタの引数でプロパティ式をふたつ渡します。ひとつはコレクションのプロパティ、
> もう一つはカンマ区切りの文字列が格納されるプロパティになります。
>
> カンマ区切り値が欲しいときは、格納先のプロパティから取り出せばよいです。
>
> public static class CommaSeparatateStringModel extends PropertyModel<Collection<String>> {
>
> 	PropertyModel<String> stringModel;
>
> 	public CommaSeparatateStringModel(Object modelObject, String expression, String stringExpression) {
> 		super(modelObject, expression);
> 		stringModel = new PropertyModel<String>(modelObject, stringExpression);
> 	}
>
> 	@Override
> 	public void setObject(Collection<String> object) {
> 		if(object == null) {
> 			stringModel.setObject("");
> 		} else {
> 			stringModel.setObject(StringUtils.join(object, ","));
> 		}
>
> 		super.setObject(object);
> 	}
>
> 	@Override
> 	public void detach() {
> 		stringModel.detach();
> 		super.detach();
> 	}
> }
>
>
> もしすでに文字列用のモデルが用意されていて再利用したいなら、stringModelの部分を、準備済みの
> モデルで置き換えてやればうまくいくと思います。
>
> お試しくださいな。
>
>
> On 2008/12/06, at 15:04, Susumu ISHIGAMI wrote:
>
>> いつもお世話になっています。
>> 石上です。
>>
>> CheckBoxMultipleChoice、ListMultipleChoiceなどの
>> 複数選択系のコンポーネントについて悩んでいます。
>>
>> これらは、モデルに、Collectionを格納することを要求します。
>> もしStringオブジェクトを入れると、
>> 下記のような例外が発生してしまいます。
>>
>> WicketMessage: Model object for a ListMultipleChoice must be a
>> Collection (found class java.lang.String)Root cause:
>> org.apache.wicket.WicketRuntimeException: Model object for a
>> ListMultipleChoice must be a Collection (found class java.lang.String)
>>   at org.apache.wicket.markup.html.form.ListMultipleChoice.getModelValue(ListMultipleChoice.java:190)
>>
>> 気持ちはわかりますが、
>> こちらとしては、諸事情により、カンマ区切り文字列で読み書きしてもらえると一番助かります。
>>
>> 私はモデルの上にモデルをラップして、内部モデルのStringをCollectionに見せかけようとして、、、失敗しました。(汗
>> う〜ん、Converterを使えばいいのでしょうか?
>>
>> もしかしたら同じ悩みを抱えている方がいらっしゃるかもしれないので、
>> 質問させていただくことにしました。
>>
>> よろしくお願いします。
>>
>> _______________________________________________
>> Wicket-ja-user mailing list
>> Wicke****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
>
> ---------------------------------------------------
> 矢野 勉(やの つとむ)
> 電子メール:benbrand_at_mac.com
> ---------------------------------------------------
>
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user



Wicket-ja-user メーリングリストの案内
アーカイブの一覧に戻る