Java 使用带背景图的Wicket中继器
所以本质上我想使用Wicket 1.5来显示一个项目及其关联的数量。我用来支持这一点的数据结构是一个映射(newhashmap()),其中项是一个POJ,其详细信息无关紧要。基本上我想使用wicket的一个中继器,但我只有使用ListView的经验。是否有一个中继器可以很好地与地图配合使用,或者我需要自己编写代码?如果我需要自己编写代码,最好重写什么类 我认为中继器的输出基本上类似于: QuantityX:ItemName(ItemNum) 例如: 2x:someItem(255609)Java 使用带背景图的Wicket中继器,java,wicket,Java,Wicket,所以本质上我想使用Wicket 1.5来显示一个项目及其关联的数量。我用来支持这一点的数据结构是一个映射(newhashmap()),其中项是一个POJ,其详细信息无关紧要。基本上我想使用wicket的一个中继器,但我只有使用ListView的经验。是否有一个中继器可以很好地与地图配合使用,或者我需要自己编写代码?如果我需要自己编写代码,最好重写什么类 我认为中继器的输出基本上类似于: QuantityX:ItemName(ItemNum) 例如: 2x:someItem(255609) 映射可
映射可以通过用户输入进行更改,但我熟悉通过Wicket使用AJAX刷新组件的标记。非常感谢您的帮助。一个选项是使用您的Listview,并向它提供一个列表,您可以从类似于
数组的映射中检索。asList(HashMap\values\toArray)
通常我更喜欢循环而不是重复,因为您只需要提供一个整数模型,比如AbstractReadOnlyModel来定义迭代次数。在这种情况下,您可以轻松地构建自己的模型,并使用助手方法从任何地方获取数据。
我想你真的想构建自己的repeater,你应该扩展AbstractRepeater,但你应该围绕循环构建。我最终使用了ListView,ListView模型保存了上面Thorsten建议的Map.Entry。它按预期工作,谢谢Thorsten。请参阅本文:
public CustomFieldsPanel(字符串id、最终IModel fieldMapModel、最终反馈面板反馈面板){
super(id,fieldMapModel);
this.feedbackPanel=反馈面板;
this.setOutputMarkupId(true);//AJAX JavaScript代码需要有一些id=“…”。
IModel listModel=新的LoadableDetachableModel(){
@覆盖受保护列表加载(){
Map Map=(Map)CustomFieldsPanel.this.getDefaultModelObject();
返回新的ArrayList(map.values());
}
};
列表视图列表视图;
添加(listView=new listView(“fieldsRows”,listModel){
@凌驾
受保护的无效填充项(最终列表项){
添加(新的CustomFieldRowPanel(“fieldRow”,item.getModel()){
//已单击删除图标。
@凌驾
受保护的无效onDelete(AjaxRequestTarget目标){
Map fieldsMap=(Map)CustomFieldsPanel.this.getDefaultModelObject();
fieldsMap.remove(item.getModelObject().getName());
target.add(CustomFieldsPanel.this);//更新用户界面。
试一试{
CustomFieldsPanel.this.onChange(目标);//持续存在。
}捕获(例外情况除外){
反馈面板错误(例如toString());
}
}
});
}
});
...
}
这是只读的吗?地图的键/值是什么?地图上有用户通过表单/ajax动态添加的项目和数量。键值是Item->Quantity,其中Item是表示业务对象的我的POJ。为什么不迭代键值集(作为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() );
}
}
});
}
});
...
}