Java ListView中的Wicket表单组件值更改会影响所有元素

Java ListView中的Wicket表单组件值更改会影响所有元素,java,wicket,Java,Wicket,我有一个列表视图用于添加多行,其中包含表单元素(文本输入、选择等),这些元素对应于作为元素列表的模型上的属性。当表单第一次加载时,元素被初始化为该类的新实例。Wicket似乎无法区分它们,除非我显式地向该对象的属性添加不同的值。它只在我更改列表视图最后一行中的某个内容时更改值,当它更改时,它会更改所有内容,就像它们都是同一个对象一样 例如: Arrays.asList(new String(), new String(), new String()); vs 当以第二种方式实现传递到List

我有一个
列表视图
用于添加多行,其中包含表单元素(文本输入、选择等),这些元素对应于作为元素列表的模型上的属性。当表单第一次加载时,元素被初始化为该类的新实例。Wicket似乎无法区分它们,除非我显式地向该对象的属性添加不同的值。它只在我更改
列表视图最后一行中的某个内容时更改值,当它更改时,它会更改所有内容,就像它们都是同一个对象一样

例如:

Arrays.asList(new String(), new String(), new String()); 
vs

当以第二种方式实现传递到
ListView
的列表时,Wicket仅更改单个行的值

下面是我正在使用的代码的简化示例:

WebMarkupContainer container = new WebMarkupContainer("container");
ListView<String> listView = new ListView<String>("propertyListView", model.getObjectsList()) {
                @Override
                protected void populateItem(final ListItem listItem) {
                    listItem.add(new TextField<String>("string", new PropertyModel<>(listItem.getModelObject(), "stringField")));
                }
            };
            listView.setReuseItems(true);
container.add(listView);
form.add(container);
WebMarkupContainer=新的WebMarkupContainer(“容器”);
ListView ListView=新建ListView(“propertyListView”,model.getObjectsList()){
@凌驾
受保护的void populateItem(最终列表项列表项){
添加(新文本字段(“字符串”,新属性模型(listItem.getModelObject(),“stringField”));
}
};
setReuseItems(true);
container.add(listView);
表格.加入(容器);

我的问题是:是否有某种类型的接口可以实现,这样我就不必使用初始化具有不同属性值的对象的“欺骗”,如果是,是什么/如何实现的?

您正在展开模型,这不是很危险,可能是您出现问题的原因

我将代码重写为如下内容:

  ListView<String> listView = new ListView<String>("meetingFiles", model) {
                @Override
                protected void populateItem(final ListItem<String> listItem) {
                    listItem.add(new TextField<String>("string", listItem.getModel()));
                }
            };
            listView.setReuseItems(true);
   container.add(listView);
   form.add(container);
ListView ListView=新建ListView(“会议文件”,模型){
@凌驾
受保护的void populateItem(最终列表项列表项){
添加(新的文本字段(“字符串”,listItem.getModel());
}
};
setReuseItems(true);
container.add(listView);
表格.加入(容器);

您正在展开模型,这并不是很危险,可能是您出现问题的原因

我将代码重写为如下内容:

  ListView<String> listView = new ListView<String>("meetingFiles", model) {
                @Override
                protected void populateItem(final ListItem<String> listItem) {
                    listItem.add(new TextField<String>("string", listItem.getModel()));
                }
            };
            listView.setReuseItems(true);
   container.add(listView);
   form.add(container);
ListView ListView=新建ListView(“会议文件”,模型){
@凌驾
受保护的void populateItem(最终列表项列表项){
添加(新的文本字段(“字符串”,listItem.getModel());
}
};
setReuseItems(true);
container.add(listView);
表格.加入(容器);

我想你可能误解了。
ListItem-ListItem
中的项目是需要在
ListView
中迭代的项目。您应该为您的问题提供更多细节和解释。您的模型对象是字符串列表吗?不,对象列表是模型上的属性,这就是传递到列表视图的内容。我试图在问题的第一句话中解释,我想你可能误解了。
ListItem-ListItem
中的项目是需要在
ListView
中迭代的项目。您应该为您的问题提供更多细节和解释。您的模型对象是字符串列表吗?不,对象列表是模型上的属性,这就是传递到列表视图的内容。我试图在问题的第一句话中解释这一点