2

ウィケットを使用してテーブルのリストを表示しています。テーブルの数と各テーブルの行の数はどちらも動的です。

私はそれをシンプルに保ち、それぞれにRepeatingViewを使用してネストしようとしていますが、wicketは次のように述べています。

java.lang.IllegalArgumentException:ID'table'の子はすでに存在します

これが私のJavaです:

   RepeatingView view = new RepeatingView("listoftables");

    for (CCSubscription sub: getCustomer().getSubscriptions())  {

        //resource balance table
        ResourceBalance[] resBals = sub.getResourceBalances();
        if(resBals!=null && resBals.length>0)   {
        ListView<ResourceBalance> resBalTable = new ListView<ResourceBalance>("table", Arrays.asList(resBals)) {

            @Override
            protected void populateItem(ListItem<ResourceBalance> item) {
                ResourceBalance bal = item.getModelObject();
                item.add(new Label("resource", bal.getResource().getName()));
                item.add(new Label("balance", bal.getBalance()));
            }
        };
        view.add(resBalTable);
        }   //end if sub has non-null resource balance

    }   //end loop through subscriptions

    add(view);

そして私のhtmlは:

<ul>
<li wicket:id="listoftables">
<fieldset>
<legend><b>Resource Balances</b>
</legend>
    <table class="dataview" style="width:50%">
        <thead>
            <tr class="headers">
                <th>Resource</th>
                <th>Balance</th>

            </tr>
        </thead>
        <tr wicket:id="table">
            <td>
                <span wicket:id="resource"></span>
            </td>
            <td>
                <span wicket:id="balance"></span>
            </td>
        </tr>
    </table>
</fieldset>
<br/>

私はおそらくこれを間違った方法で行っていることを認めますが、正しい方法がどうあるべきかわかりません。

誰かが助けてくれることを願っています!?

4

3 に答える 3

4

OK、動作しました:

final ListView<CCSubscription> tables = new ListView<CCSubscription>(
            "tables", getCustomer().getSubscriptions()) {
        @Override
        protected void populateItem(ListItem<CCSubscription> item) {
            ListView<ResourceBalance> resBalTable = new ListView<ResourceBalance>("listview", Arrays.asList(item.getModel().getObject().getResourceBalances())) {

                @Override
                protected void populateItem(ListItem<ResourceBalance> item) {
                    ResourceBalance bal = item.getModelObject();
                    item.add(new Label("resource", bal.getResource().getName()));
                    item.add(new Label("balance", bal.getBalance()+""));
                }
            };
            item.add(resBalTable);
        }
    };

    add(tables);

そして、htmlは次のようになります。

<span wicket:id="tables">
<fieldset>
<legend><b>Resource Balances</b>
</legend>
    <table class="dataview" style="width:50%">
        <thead>
            <tr class="headers">
                <th>Resource</th>
                <th>Balance</th>

            </tr>
        </thead>
        <tr wicket:id="listview">
            <td>
                <span wicket:id="resource"></span>
            </td>
            <td>
                <span wicket:id="balance"></span>
            </td>


        </tr>
    </table>
</fieldset>
<br/>

于 2013-01-07T12:45:08.743 に答える
2

ListView("table")同じ ID ( ) を持つ 2 つのコンポーネントを 1 つのコンテナ ( ) に追加することはできませんRepeatingView

オブジェクトには、子コンポーネントのRepeatingViewID を生成するメソッドがあります。javadocから:

RepeatingView view = new RepeatingView("repeater");
view.add(new Label(view.newChildId(), "hello"));
view.add(new Label(view.newChildId(), "goodbye"));
view.add(new Label(view.newChildId(), "good morning"));
add(view);

ID を生成する独自のロジックを作成することもできます。

RepeatingView view = new RepeatingView("repeater");
for (int i=0; i < 10; i++)
    view.add(new MyListView("list" + i));
add(view);
于 2013-01-07T12:28:06.480 に答える
0

ループに同じオブジェクトを複数回追加していますが、これは達成しようとしているものではありません。名前付きコンポーネントは、特定のページに 1 回だけ追加できます。

クラスを ListView の拡張として定義し、レンダリングするオブジェクトのリストを渡す必要があります。ここを見てください https://cwiki.apache.org/WICKET/listview-and-other-repeaters.html

于 2013-01-07T11:54:39.730 に答える