Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用带背景图的Wicket中继器_Java_Wicket - Fatal编程技术网

Java 使用带背景图的Wicket中继器

Java 使用带背景图的Wicket中继器,java,wicket,Java,Wicket,所以本质上我想使用Wicket 1.5来显示一个项目及其关联的数量。我用来支持这一点的数据结构是一个映射(newhashmap()),其中项是一个POJ,其详细信息无关紧要。基本上我想使用wicket的一个中继器,但我只有使用ListView的经验。是否有一个中继器可以很好地与地图配合使用,或者我需要自己编写代码?如果我需要自己编写代码,最好重写什么类 我认为中继器的输出基本上类似于: QuantityX:ItemName(ItemNum) 例如: 2x:someItem(255609) 映射可

所以本质上我想使用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() );
                    }
                }
            });
        }
    });
    ...
}