0

我有一个带有 CheckGroup 的简单面板(面板本身是更大形式的一部分)。检查组中的复选框在列表视图组件中生成。我需要动态更改此面板,并且在每次更改时都需要检索所选项目。面板的代码基本上是这样的:

CheckGroup<MyObject> group = new CheckGroup<MyObject>(ID, selectedObjects);
ListView<MyObject> objectList = new ListView<MyObject>(ID, values) {

    @Override
        protected void populateItem(ListItem<MyObject> item) {
            Check<MyObject> check = new Check<MyObject>(TIME_CHECK, item.getModel());
            Label l = new Label(TIME_LABEL, item.getModel());

            item.add(check);
            item.add(l);
        }
}
group.add(objectList);
group.add(new AjaxFormChoiceComponentUpdatingBehavior() {

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            System.out.println("Selected objects: "+selectedObjects.size());
        }
    });
add(group);

现在,问题是,每当我单击复选框时,两个相同的对象都会添加到selectedObjects列表中。如果我删除AjaxFormChoiceComponentUpdatingBehavior,则不会将任何对象添加到列表中(这是有道理的,因为此时我没有提交表单)。

我不完全确定如何解决这个问题,我想出的最佳解决方案是获取列表并通过它,消除重复。

另外,对不起标题,但我不知道如何命名这个问题。

这是一个澄清问题的小例子:假设检查组正在显示这些对象:

object 1
object 2
object 3
object 4
object 5

然后当我选择object 1检查组的模型(=selectedObjects)时,将如下所示:

object 1
object 1
4

3 回答 3

1

这是检票口上的一个错误。我使用了 7.1 版本,然后在 7.10 版本上进行了更改,问题解决了!

于 2018-05-31T10:16:33.583 回答
0

您可以尝试以下构造,重新创建检查组以使其保持最新状态。也许有点矫枉过正,但它应该可以解决问题。

   private CheckGroup<MyObject> group; 
   private IModel<MyObject> selectedObjects;


   public MyCurrentPanel() {
       selectedObjects = new CompoundPropertyModel<MyObject>(new MyObject());
       group = createCheckGroup();
       group.setOutputMarkupId(true);
       add(group);
   }

   public CheckGroup<MyObject> createCheckGroup() {
   CheckGroup<MyObject> newGroup = new CheckGroup<MyObject>(ID, MyCurrentPanel.this.selectedObjects);
    ListView<MyObject> objectList = new ListView<MyObject>(ID, values) {
        @Override
            protected void populateItem(ListItem<MyObject> item) {
                Check<MyObject> check = new Check<MyObject>(TIME_CHECK, item.getModel());
                Label l = new Label(TIME_LABEL, item.getModel());
                item.add(check);
                item.add(l);
            }
    }
    newGroup.add(objectList);
    newGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                System.out.println("Selected objects: "+selectedObjects.size());
                CheckGroup<MyObject> updateGroup = createCheckGroup();
                updateGroup.setOutpurMarkupId(true);
                MyCurrentPanel.this.group.replaceWith(updateGroup);
                MyCurrentPanel.this.group = updateGroup;
                target.add(MyCurrentPanel.this.group);
            }
        });
    }
于 2016-05-26T08:55:58.023 回答
0

尝试

target.add(form);`

或者

target.add(group);

或类似的东西,具体取决于您的代码。

于 2016-05-10T10:35:47.950 回答