Tsutomu Yano
benbr****@mac*****
2008年 7月 24日 (木) 23:30:22 JST
矢野です。 それでしたら、もとのリストを市町村を三つでひと単位とした配列のリストに組み直した ほうが簡単ではないでしょうか。 トリッキーな操作が必要なくなりますし、ListViewを単純にそのまま使えます。 ListViewに渡すオブジェクトはListに限らず「Listを返すモデル」を渡せますので、 データが格納されたListをコンストラクタに渡したら getObject()がList<List<String>>を返すようなモデルを定義したらどうでしょう。 下記は簡単な例でエラーチェックがあまいかもしれませんが、 まあ、例ということで。 import java.util.*; /** * 三つでひとかたまりの文字列のリストを返すモデル **/ public class MyModel extends AbstractReadOnlyModel<List<String>> { List<String> source; public MyModel(List<String> source) { this.source = new ArrayList<String>(source); } public List<List<String>> getObject() { List<List<String>> result = new ArrayList<List<String>>(); for(int i = 0; i < source.size(); i += 3) { List<String> trio = new ArrayList<String>(3); trio.add(source.get(i)); trio.add(source.get(i+1)); trio.add(source.get(i+2)); result.add(trio); } return result; } } このようなMyModelを定義しておくと、 List<String> source = Arrays.asList("新宿区", "豊島区", "文京区", "渋谷区", "町田市", "立川市"); ListView<List<String>> view = new ListView<List<String>>("view", new MyModel(source)) { @Override protected void populateItem(ListItem<List<String>> item) { List<String> data = item.getModelObject(); item.add(new Label("id1", data.get(0)); item.add(new Label("id2", data.get(1)); item.add(new Label("id3", data.get(2)); } } のようなコードを書くことが出来るようになります。すると <tr wicket:id="view"> <td wicket:id="id1"></td> <td wicket:id="id2"></td> <td wicket:id="id3"></td> </tr> と単純なHTMLを書くだけで三つ単位の繰り返しができます。<tr>を出したり消したりも必要ありません。 私が思うにWicketの利点の一つは基本的に全部Java側で処理することにあるわけで、三つ単位にデータを 処理したいのであれば、タグを変に加工するよりJava側で三つ単位にデータを処理すれば良いのだと思う のですがどうでしょうか。 On 2008/07/24, at 22:28, 川嶋 誠司 wrote: > やのさん、すいません > > やはりわかりづらかったですか > > やりたいことは市区町村のListから > 1行3列のtableを作りたいのですが > > ListView に市区町村Listを渡して > populateItemで > > <tr><td><span wicket:id="cityName">市区町村名</span></td></tr> > > の単位で普通に出力すると1行1列になってしまうので > > インデックスが3n-2の時だけ<tr>を出力し > インデックスが3nの時だけ</tr>を出力すれば > > <tr><td>新宿区</td> > <td>豊島区</td> > <td>文京区</td></tr> > <tr><td>渋谷区</td> > <td>町田市</td> > <td>立川市</td></tr> > > のように1行3列になるかなと思いましたが > > スマートな実現方法がわからなかったのです > > ----- Original Message ----- > From: "Tsutomu Yano" <benbr****@mac*****> > To: <wicke****@lists*****> > Sent: Thursday, July 24, 2008 3:15 AM > Subject: [Wicket-ja-user 157] Re: あるタグを出したい時、出したくない時の制御 > > >> んーありがちなケースとのことなのでやりたいことはシンプルなことなのでしょうが >> >> >> ちょっとよくわからないんです。 >> >> <tr>を出したかったり出したくなかったりする理由はなんなのでしょうか? >> >> 通常、テーブルの行繰り返しなら<tr>にListViewを適用すれば済むと思うのですが、今回は >> <tr>タグだけ出したり出さなかったりして、その内側の<td>タグは常に表示するのですよね? >> >> >> 「結果としてこういうタグを出力したい」というのが見えてくれば、なにか別の解決法も >> 見えてくるように思うのですが...いかがでしょうか。 >> >> >> On 2008/07/24, at 0:02, 川嶋 誠司 wrote: >> >>> 川嶋です >>> >>> ありがちなケースだと思われましたが >>> サンプルが見つかりませんでした >>> なにか良い実装方法はないでしょうか? >>> >>> やりたいこと) >>> 市町村Listをつかってtdが3列のtabelを作りたい。 >>> >>> 例) >>> >>> <tr><td>○○市</td><td>△△市</td><td>□□市</td></tr> >>> ・・・・ >>> ・・・・ >>> <tr><td>○△町</td><td>△□町</td><td>○□村</td></tr> >>> >>> 考えた方法) >>> populateItem内で・・・・ >>> 1.start_tr、end_trのコンポーネントを出したくない時は >>> addするけどsetVisible(false) >>> 2.start_tr、end_trのコンポーネントのreplaceComponentTagBody >>> で<tr>、</tr>を出したり出さなかったり。 >>> >>> <wicket:container wicket:id="list"> >>> <wicket:container wicket:id="start_tr"><tr></wicket:container > >>> <td><span wicket:id="cityName">hoge市</span></td> >>> <wicket:container wicket:id="end_tr"></tr></wicket:container > >>> </wicket:container > >>> >>> 1.も2.も、出力したくないときでもコンポーネントを >>> addしなければいけないのが嫌です >>> >>> かわしま >>> >>> _______________________________________________ >>> 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