java - ListView 中的组件不会在 AJAX 刷新时更新

标签 java wicket

我有一个 Wicket 面板,其中包含 ListView 和子项目(表单控件),但是当我按下内部复选框时,某些子项目的可见性应该发生变化。

但是,在 AJAX 更新期间重绘 ListView 后,调用 WebMarkupContainer.setVisible(false) 不会隐藏 ListView 中的项目。

代码如下:

public class ImagePanel extends Panel {

private ArrayList<ImageEntry> imageEntryList;

public class ImageEntry implements Serializable {

    private static final long serialVersionUID = -3987685200930059655L;

    public String thumbnail;
    public String filename;
    public boolean webDownloaded;
    public WebMarkupContainer fileUpload;
    public WebMarkupContainer webDownload;
}

public ImagePanel(String id) {
    this(id, IMAGE_NORMAL);
}

public ImagePanel(String id, int type) {
    super(id);
    this.type = type;

    wmc = new WebMarkupContainer ("wmc");
    wmc.setOutputMarkupId(true);
    add(wmc);

    imageEntryList = new ArrayList<ImageEntry>();
    ImageEntry imageEntry = new ImageEntry();
    imageEntry.thumbnail = "blah";
    imageEntry.filename = "blah";
    imageEntryList.add(imageEntry);

    ListView<ImageEntry> llv = new LargeImageListView("large_image_list", imageEntryList);
    wmc.add(llv);

    SmallImageListView slv = new SmallImageListView("small_image_list", imageEntryList);
    wmc.add(slv);
}

private final class SmallImageListView extends ListView<ImageEntry> {

    private SmallImageListView(String id, List<? extends ImageEntry> list) {
        super(id, list);
    }

    @Override
    protected void populateItem(final ListItem<ImageEntry> item) {

            ... 

        if (type == IMAGE_WIZARD) {
            item.getModelObject().fileUpload = showWizardFileUpload(item);
            item.getModelObject().webDownload = showWizardWebDownload(item);
            showSortUpDown(item);
            showWebCheckbox(item);
        }

    }
}


private void showWebCheckbox(final ListItem<ImageEntry> item) {

    AjaxCheckBox checkbox = new AjaxCheckBox("use_web_image", new PropertyModel<Boolean>(item.getModelObject(), "webDownloaded")) {

        public void onUpdate(AjaxRequestTarget target) {

            if (getModelObject()) {
                System.out.println("Show");
                item.getModelObject().fileUpload.setVisible(false);
                item.getModelObject().webDownload.setVisible(false);
            } else {
                System.out.println("Hide");
                item.getModelObject().fileUpload.setVisible(false);
                item.getModelObject().webDownload.setVisible(false);
            }

            target.add(wmc);
        }

    };

    item.add(checkbox);
}   

    ...

}

最佳答案

使用 ListView.setReuseItems(true) 确保 ListView 中的对象被正确序列化...否则,您每次都会收到不同的对象,并且 .setVisible() 属性将重置为其默认值(例如'真实')。

slv.setReuseItems(true);

关于java - ListView 中的组件不会在 AJAX 刷新时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485850/

相关文章:

java - Wicket 口嵌套ListView(3次)

javascript - 如何从 JavaScript Apache Wicket 调用 Java 函数

java - 在 Tomcat 5.5 中部署 web-app 时如何解决错误 listenerStart?

java - response.sendredirect() 改变方法类型

wicket - 通过 wicket 下载 zip 文件

java - 属性 'userDetailsService' : no matching editors or conversion strategy found

java - JFrame 组件未显示

java - Wicket - validator 报告警告而不是错误并且不阻止表单提交

java - java中两个对象之间的碰撞检测

java - 使用 Spring @Configuration 注释注入(inject) bean 列表