为每个项目调用Wicket Listview按钮onclick

为每个项目调用Wicket Listview按钮onclick,listview,onclick,wicket,Listview,Onclick,Wicket,我随后向ListItem中的按钮添加了click功能,但由于某种原因,当表单提交(button clicked)时,每个项目都会单击按钮,而不是单击单个项目。我可以通过将onClick添加到项目本身来获得首选结果,但我更希望将单击注册到项目中的按钮。如何在按钮上实现仅影响项目的单击操作 ListView<Games> gamesList = new ListView<Games>("gamesList", games) { private static

我随后向ListItem中的按钮添加了click功能,但由于某种原因,当表单提交(button clicked)时,每个项目都会单击按钮,而不是单击单个项目。我可以通过将onClick添加到项目本身来获得首选结果,但我更希望将单击注册到项目中的按钮。如何在按钮上实现仅影响项目的单击操作

ListView<Games> gamesList = new ListView<Games>("gamesList", games) {

        private static final long serialVersionUID = 1L;

        @Override
        protected void populateItem(final ListItem<Games> item) {
            Form<?> form = new Form<>("exportForm");
            final SpecialButton exportButton = new SpecialButton("exportButton", item);
            form.add(exportButton);
            ...
            item.add(form);
        }
}

private class SpecialButton extends AjaxButton {
    final ListItem<Games> item;

    public SpecialButton(final String id, final ListItem<Games> item) {
        super(id);

        this.item = item;
    }

    @Override
    protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
        // here you cand do everything you want with the item and the model object of the item.(row)
        Games game = item.getModelObject();
        System.out.println("Calling file generation with match id: " + game.getGameId()
        + " summoner id: " + game.getSummonerId() 
        + " enemy name: " + game.getEnemyChampName());
    }

}
ListView gamesList=新的ListView(“gamesList”,游戏){
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的无效填充项(最终列表项){
表格=新表格(“出口表格”);
最终特殊按钮exportButton=新的特殊按钮(“exportButton”,项目);
表单添加(导出按钮);
...
项目.添加(表格);
}
}
私有类SpecialButton扩展AjaxButton{
最后清单项目;
公共特殊按钮(最终字符串id、最终列表项){
超级(id);
this.item=项目;
}
@凌驾
提交时受保护的void(最终AjaxRequestTarget目标,最终表单){
//在这里,您可以对该项和该项的模型对象执行任何操作
Games game=item.getModelObject();
System.out.println(“使用匹配id:+game.getGameId()调用文件生成”)
+“召唤师id:+game.get召唤师id()
+敌人名称:“+game.getEnemyChampName());
}
}

是listview的图像(如果有帮助的话)。按钮以红色显示。

提交按钮提交整个表单,即表单中的所有项目都将更新。不管你有多少个提交按钮,它们都会做同样的事情


使用(6.21.0+&7.1.0+)可以将AjaxFormComponentUpdateBehavior附加到项目,并且只提交其子组件的数据。

您真的需要该表单吗?从你的代码中,我假设你在这个过程中只需要游戏对象?为什么不使用一个简单的
AjaxLink

item.add(new AjaxLink<Games>("exportButton", item.getModel()) {
    public void onClick(AjaxRequestTarget target) {
        // generate export 
    }
});
item.add(新的AjaxLink(“exportButton”,item.getModel()){
公共void onClick(AjaxRequestTarget目标){
//生成导出
}
});

这并没有解决问题。单击导出仍然会触发每个单元格项。我尝试传递
项.getModel()
项.getModelObject()
。所有单元格项都将触发提交。您可以发布标记吗?如果您在标记中的按钮上设置了一个id,它将触发具有相同id的所有按钮。在这种情况下,所有exportButtons。仍然是相同的问题。当我点击这个项目的导出按钮时,每次点击都会被调用,我的日志信息会被打印50多次。