2012-04-27 12 views
3

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

我将转发器的输出基本上是这样的:

QUANTITYX:ITEMNAME(ItemNum)

所以例如:

2倍:someItem(255609)

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

+0

这是只读?地图的关键/价值是什么? – bert 2012-04-27 17:14:15

+1

该地图包含由用户通过表单/ ajax动态添加的项目和数量。关键值是项目 - >数量,其中项目是我POJ代表的业务对象。 – thatidiotguy 2012-04-27 18:43:17

+1

为什么不迭代KeySet(如ListView的Model),然后将值分配给键? – 2012-04-27 19:29:34

回答

1

我最终使用了ListView,其中ListView模型持有上面Thorsten建议的Map.Entry。它按预期工作,并感谢Thorsten。

0

一种选择是使用你的ListView和一个列表喂养它,你可以从地图状Arrays.asList(HashMap#values#toArray) 一般来说,我喜欢河套Reapeat东西retrive,因为你只需要提供一个整数型像AbstractReadOnlyModel定义的数迭代。在这种情况下,您可以轻松地构建您自己的模型和帮助程序以从任何地方获取数据。 我真的想建立自己的中继器,你应该扩展AbstractRepeater,但你应该建立在Loop周围。

+0

你能否提供一些伪代码来说明这一点?我很困惑,你正在试图通过什么。 – thatidiotguy 2012-04-30 14:14:27

0

看到这篇文章:Wicket Model magic: Map-backed 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()); 
        } 
       } 
      }); 
     } 
    }); 
    ... 
}