【问题标题】:Wicket: Dynamically fill cells with custom contentWicket:使用自定义内容动态填充单元格
【发布时间】:2015-09-01 07:04:28
【问题描述】:

我使用 wicket ListViews 创建了一个表格来创建列和行,代码如下所示:

ErhebungMatrixPanel.java

public ErhebungMatrixPanel(String id) {
    super(id);
    this.add(matrixForm);
    matrixForm.add(new ListView<Zustaendigkeit>("columns", zustaendigkeiten){
        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(ListItem<Zustaendigkeit> item) {
            final int index = item.getIndex();
            item.add(new Label("zustLabel", zustaendigkeiten.get(index).getName().toString()));
        }
    });

    matrixForm.add(rows = new ListView<Erhebung>("rows", erhebungen){
        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(ListItem<Erhebung> item) {
            final IModel<Boolean> checked = Model.of(Boolean.FALSE);
            final int index = item.getIndex();
            item.add(new Label("erhebungLabel", erhebungen.get(index).getName()));

            item.add(new AjaxCheckBox("check", checked) {
                private static final long serialVersionUID = 1L;

                @Override
                protected void onUpdate(AjaxRequestTarget target) {
                    //TODO
                }
            });
        }
    });
}

在这个表中,我想在每个单元格中放置一个 AjaxCheckBox,以创建类似于 授权矩阵 的东西,现在问题是,因为列表的长度 zustaendigkeiten 最一段时间可能会变大,我无法插入静态数量的复选框。现在只有表格的一列被复选框覆盖。响应的 .html 文件如下所示:

<wicket:panel>
    <form wicket:id="matrixForm">
        <table class="matrix">
            <thead>
                <tr class="headers">
                    <th></th>
                    <span wicket:id="columns">
                        <th wicket:id="zustLabel"></th>
                    </span>
                </tr>
            </thead>
            <tbody>
                <tr wicket:id="rows">
                    <th wicket:id="erhebungLabel"></th>
                    <td><input wicket:id="check" type="checkbox" /></td>
                </tr>
            </tbody>
        </table>
    </form>
</wicket:panel>

类似这样的:

<tbody>
<tr wicket:id="rows">
    <th wicket:id="erhebungLabel"></th>
    <td><input wicket:id="check" type="checkbox" /></td>
    <td><input wicket:id="check" type="checkbox" /></td>
    <td><input wicket:id="check" type="checkbox" /></td>                
</tr>
</tbody>

显然行不通,因为 1. 它应该是动态的,但我猜 JS 可以提供帮助,2. Wicket 会抛出 MarkUp 错误。

是否有任何 newCellItem 类似的方法我可以像在 DataTable 中一样使用?

【问题讨论】:

    标签: java listview html-table wicket markup


    【解决方案1】:

    你需要这样的东西吗?

    HTML:

    <form>
        <table>
            <tr>
                <th></th>
                <th wicket:id="headerList"><span wicket:id="name"></span></th>
            </tr>
            <tr wicket:id="rowList">
                <td wicket:id="name"></td>
                <td wicket:id="cellList">
                    <input type="checkbox" wicket:id="checkbox"/>
                </td>
            </tr>
        </table>
    </form>
    

    Java:

    add(new ListView<User>("headerList", new PropertyModel<>(this, "users")) {
        @Override
        protected void populateItem(ListItem<User> listItem) {
            listItem.add(new Label("name", new PropertyModel(listItem.getModelObject(), "name")));
        }
    });
    
    add(new ListView<String>("rowList", new PropertyModel<>(this, "roles")) {
    
        @Override
        protected void populateItem(ListItem<String> listItem) {
            final String role = listItem.getModelObject();
    
            listItem.add(new Label("name", role));
    
            listItem.add(new ListView<User>("cellList", new PropertyModel<>(TestPage.this, "users")) {
    
                @Override
                protected void populateItem(ListItem<User> listItem) {
                    final User user = listItem.getModelObject();
    
                    listItem.add(new AjaxCheckBox("checkbox", new IModel<Boolean>() {
    
                        @Override
                        public Boolean getObject() {
                            return user.getRoles().contains(role);
                        }
    
                        @Override
                        public void setObject(Boolean aBoolean) {
                            if (aBoolean) {
                                user.getRoles().add(role);
                            } else {
                                user.getRoles().remove(role);
                            }
                        }
    
                        @Override
                        public void detach() {
    
                        }
                    }) {
    
                        @Override
                        protected void onUpdate(AjaxRequestTarget ajaxRequestTarget) {
    
                        }
                    });
                }
            });
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多