所以基本上我想用Wicket 1.5显示一个项目及其相关数量。我用来支持它的数据结构是一个Map(新的HashMap()),其中Item是一个POJ,其细节无关紧要。基本上我想使用一个wicket的中继器,但我只有使用ListView的经验。是否有一个适用于地图的转发器,或者我是否需要自己编码?如果我需要编写自己的代码,那么覆盖的最佳类是什么?
我希望转发器的输出基本上是这样的:
QuantityX:ItemName(ItemNum)
所以例如:
2x:someItem(255609)
地图可以通过用户输入进行更改,但我熟悉通过Wicket使用AJAX刷新组件的标记。非常感谢您的帮助。
答案 0 :(得分:1)
我最终使用了ListView,其中ListView模型按照Thorsten的建议持有Map.Entry。它按预期工作,谢谢Thorsten。
答案 1 :(得分:0)
一种选择是使用您的Listview并将其提供给您可以从地图中检索的列表,例如Arrays.asList(HashMap#values#toArray)
通常我更喜欢Loop to Reapeat的东西,因为你只需提供一个像AbstractReadOnlyModel这样的整数模型来定义迭代次数。在这种情况下,您可以轻松地构建自己的模型,从任何地方获取数据的辅助方法。
我真的想要构建自己的转发器,你应该扩展AbstractRepeater,但你应该建立在Loop周围。
答案 2 :(得分: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() );
}
}
});
}
});
...
}