3

所以本质上我想使用 Wicket 1.5 来显示一个项目及其相关数量。我用来支持这一点的数据结构是一个 Map (new HashMap()),其中 Item 是一个 POJ,其细节无关紧要。本质上我想使用一个wicket 的中继器,但我只有使用ListView 的经验。是否有一个可以很好地与地图配合使用的中继器,还是我需要自己编写代码?如果我需要自己编写代码,最好覆盖什么类?

我希望中继器的输出基本上是这样的:

QuantityX : 项目名称 (ItemNum)

例如:

2x : 一些物品 (255609)

地图可以通过用户输入进行更改,但我熟悉通过 Wicket 使用 AJAX 刷新组件的标记。非常感谢您的帮助。

4

3 回答 3

1

我最终使用 ListView ,其中 ListView 模型持有 Map.Entry ,正如上面 Thorsten 所建议的那样。它按预期工作,谢谢Thorsten。

于 2012-05-01T18:34:14.813 回答
0

请参阅本文:Wicket 模型魔术:地图支持的 ListView

public CustomFieldsPanel( String id, final IModel<Map<String,ProductCustomField>> fieldMapModel, final FeedbackPanel feedbackPanel ) {

    super( id, fieldMapModel );
    this.feedbackPanel = feedbackPanel;

    this.setOutputMarkupId( true ); // AJAX JavaScript code needs to have some id="...".

    IModel<List<ProductCustomField>> listModel = new LoadableDetachableModel() {
        @Override protected List<ProductCustomField> load() {
            Map<String,ProductCustomField> map = (Map) CustomFieldsPanel.this.getDefaultModelObject();
            return new ArrayList(map.values());
        }
    };

    ListView<ProductCustomField> listView;
    add( listView = new ListView<ProductCustomField>("fieldsRows", listModel){
        @Override
        protected void populateItem( final ListItem<ProductCustomField> item ) {
            item.add( new CustomFieldRowPanel("fieldRow", item.getModel()){
                // Delete icon was clicked.
                @Override
                protected void onDelete( AjaxRequestTarget target ) {
                    Map<String,ProductCustomField> fieldsMap = (Map) CustomFieldsPanel.this.getDefaultModelObject();
                    fieldsMap.remove( item.getModelObject().getName() );
                    target.add( CustomFieldsPanel.this ); // Update UI.
                    try {
                        CustomFieldsPanel.this.onChange( target ); // Persists.
                    } catch (Exception ex){
                        feedbackPanel.error( ex.toString() );
                    }
                }
            });
        }
    });
    ...
}
于 2013-01-22T03:40:40.200 回答
0

一种选择是使用您的 Listview 并为其提供一个您可以从地图中检索的列表,例如Arrays.asList(HashMap#values#toArray) 通常我更喜欢 Loop to Reapeat 的东西,因为您只需提供一个像 AbstractReadOnlyModel 这样的整数模型来定义迭代次数。在这种情况下,您可以轻松地构建自己的模型和辅助方法来从任何地方获取数据。如果您真的想构建自己的中继器,您应该扩展 AbstractRepeater,但您应该围绕 Loop 构建。

于 2012-04-28T11:03:08.547 回答