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

Back to archive index

Susumu ISHIGAMI susum****@gmail*****
2008年 12月 8日 (月) 10:17:22 JST


石上です。

今手元にPCがないので、確かめられるのは早くて明日の午後になってしまいます。

やはり、モデルを2段にするのが一番なのですね。

私が失敗していたのは、getModelをunmdifiableで返していたせいのようです。
矢野さんのように、単にArrayListで返せば、変更後setObjectされるので、問題なく更新されるのですね。

以下は私が試して失敗したことです。

コンバータ

→調べた限り、ここではちょっと違うようでした。

***MultipleChoiceクラスのgetModelVelueをオーバーライド

→finalでした。

自分で***MultipleChoiceクラスを定義

→親クラスがパッケージプライベートでした。


モデルを工夫して使って、できるだけ既存のコンポーネントに手を加えないというのは、Wicketではスマートな方法となのですね。

初めはなんて強引で遠回りな、と思ったのですが、矢野さんのコードそうなっていたので、安心しました。

今回は勉強になりました。

よろしくお願いします。

08/12/08 に Tsutomu Yano<benbr****@mac*****> さんは書きました:
> すみません、あとからやってることが目的と違うことに気がつきました。
> バックエンドのデータがカンマ区切りの文字列なんですね。それをもとにチェックボックスが表示され、
> 更新内容もそのカンマ区切り文字列に反映しないといけないですね。
>
> 次のモデルであれば、カンマ区切りの文字列の入ったプロパティを指定することで、それをもとに
> チェックボックスを表示したり、プロパティを更新したりできます。
>
> 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 mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
>



Wicket-ja-user メーリングリストの案内
Back to archive index