Java 如何更新CheckboxMultipleChice的模型?

Java 如何更新CheckboxMultipleChice的模型?,java,wicket,Java,Wicket,ClassChoice控件继承checkboxmultipleechoice。它是一个常用控件,用于会话中保留选择的多个页面。从数据库中获取可用选项。当存在多个数据项时,会添加一个“全部”复选框。在某些页面上,选择更改会导致使用新数据刷新页面。在另一个页面上,选择应更改而不刷新 我的问题是,当其他复选框更改时,我需要控制“全部”复选框,当“全部”复选框更改时,我需要更改所有复选框 我试图调用updateModel()强制进行更改,但没有成功。如何在不刷新页面的情况下更改选择(模型参数参数) 此编

ClassChoice
控件继承
checkboxmultipleechoice
。它是一个常用控件,用于会话中保留选择的多个页面。从数据库中获取可用选项。当存在多个数据项时,会添加一个“全部”复选框。在某些页面上,选择更改会导致使用新数据刷新页面。在另一个页面上,选择应更改而不刷新

我的问题是,当其他复选框更改时,我需要控制“全部”复选框,当“全部”复选框更改时,我需要更改所有复选框

我试图调用
updateModel()
强制进行更改,但没有成功。如何在不刷新页面的情况下更改选择(模型<代码>参数<代码>参数)

此编辑的代码不显示页面刷新

public class ClassChoice<T> extends CheckBoxMultipleChoice
{
    private static final long serialVersionUID = 1L;

    @SpringBean
    private ClassService classService;

    List<EntityClassModel> selection;
    EntityClassModel ecmAll;

    static List<EntityClassModel> availableClasses;

    public ClassChoice(..)
    {
        super("classcheckboxes");

        setSuffix(" "); // sets checkbox separator and ensures inline display

        ecmAll = (EntityClassModel) modelFactory.getNewClassModel();
        ecmAll.setClassname("All");

        // List of all classes associated with user
        availableClasses = classService.getListOfClasses(..);
        setClassChoices();

        add( new AjaxFormChoiceComponentUpdatingBehavior()
        {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target)
            {
                List<Integer> previousIDs = UserSession.get().getSelectedClassIDs();
                if ((previousIDs.size() > 0) && ((previousIDs.size() + 1)  >= availableClasses.size()))
                {
                    // Was previously Select All
                    if (selection.get(selection.size() - 1) == ecmAll)
                    {
                        // Select All still selected, remove it
                        selection.remove(selection.size() - 1);
                    }
                    else
                    {
                        // Remove all selections
                        selection.clear();
                    }
                }
                else if (selection.size() > 0)
                {
                    // Was none or some selected
                    if (selection.get(selection.size() - 1) == ecmAll)
                    {
                        // Select All, select all available
                        selection.clear();
                        selection.addAll(availableClasses);
                    }
                    else if ((selection.size() + 1) >= availableClasses.size())
                    {
                        // Is now full, add Select All
                        selection.add(ecmAll);
                    }
                    // else change but no special handling required
                }
                // else none are currently selected

                UserSession.get().setSelectedClasses(selection);

                // Generate a list of selected class IDs, excluding All
                List<Integer> selectedIDs = new ArrayList<Integer>();
                int copysize = selection.size();
                if ((copysize > 0) && (selection.get(copysize - 1) == ecmAll))
                {
                    copysize--;
                }
                for (int index = 0; index < copysize; index++)
                {
                    selectedIDs.add(selection.get(index).getId());
                }
                UserSession.get().setSelectedClassIDs(selectedIDs);

                // Update the selections on the page
                updateModel();
            }                   
        });
        Initialize();
    }

    @SuppressWarnings("unchecked")
    protected void Initialize()
    {   
        // Grabs already selected classes from UserSession
        List<Integer> selectedIDs = UserSession.get().getSelectedClassIDs();
        selection = classService.getClassesByClassIDs(selectedIDs);
        if (selectedIDs.size() > 1)
        {
            if ((selectedIDs.size() + 1) >= availableClasses.size())
            {
                selection.add(ecmAll);
            }
        }
        setModel(Model.ofList(selection));

        // Configure the data and display
        setChoiceRenderer(new ChoiceRenderer<EntityClassModel>("classname", "id"));
        setOutputMarkupId(true);
    }

    @SuppressWarnings("unchecked")
    public void setClassChoices()
    {
        // Adds 'All' option when there is more than one class
        if (availableClasses.size() > 1)
        {
            availableClasses.add(ecmAll);
        }
        setChoices(availableClasses);

    }

    public List<EntityClassModel> getSelection()
    {
        return selection;
    }
}
公共类类选择扩展了checkboxmultipleechoice
{
私有静态最终长serialVersionUID=1L;
@春豆
私有类服务类服务;
列表选择;
实体类模型ecmAll;
静态列表可用分类;
公共类选择(……)
{
超级(“类别复选框”);
setSuffix(“”;//设置复选框分隔符并确保内联显示
ecmAll=(EntityClassModel)modelFactory.getNewClassModel();
ecmAll.setClassname(“全部”);
//与用户关联的所有类的列表
availableClasses=classService.GetListofClass(..);
setClassChoices();
添加(新的AjaxFormChoiceComponentUpdatingBehavior()
{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标)
{
List previousIDs=UserSession.get().getSelectedClassID();
如果((previousIDs.size()>0)和((previousIDs.size()+1)>=availableClasses.size())
{
//以前是全选吗
if(selection.get(selection.size()-1)=ecmAll)
{
//选择所有仍处于选中状态的项,然后将其删除
selection.remove(selection.size()-1);
}
其他的
{
//删除所有选择
selection.clear();
}
}
else if(selection.size()>0)
{
//没有选择任何或某些
if(selection.get(selection.size()-1)=ecmAll)
{
//全选,全选可用
selection.clear();
选择。添加所有(可用的分类);
}
如果((selection.size()+1)>=availableClasses.size())
{
//现在已满,请添加并选择全部
选择。添加(ecmAll);
}
//否则会发生变化,但无需特殊处理
}
//否则,当前未选择任何选项
UserSession.get().setSelectedClasses(选择);
//生成所选类ID的列表,不包括所有
List selectedIDs=new ArrayList();
int copysize=selection.size();
if((copysize>0)和&(selection.get(copysize-1)=ecmAll))
{
字号--;
}
对于(int index=0;index1)
{
如果((selectedDS.size()+1)>=availableClasses.size())
{
选择。添加(ecmAll);
}
}
集合模型(列表(选择)的模型);
//配置数据和显示
SetChoiceRender(新的ChoiceRender(“类名”、“id”));
setOutputMarkupId(真);
}
@抑制警告(“未选中”)
public void setClassChoices()
{
//当存在多个类时,添加“All”选项
如果(可用的Classes.size()>1)
{
可用的分类。添加(ecmAll);
}
设置选项(可用的分级);
}
公共列表getSelection()
{
返回选择;
}
}

必须使用AjaxRequestTarget更新浏览器端的HTML元素。通过向
selection
添加/删除元素,您可以在服务器端更改
ClassChoice
的模型。在AjaxFormChoiceComponentUpdatingBehavior#onUpdate()的底部,您应该执行
target.add(this)
,告诉Wicket使用新的选择/模型重新绘制此ClassChoice实例


确保在其构造函数中调用
setOutputMarkupId(true)
,否则将无法使用Ajax更新它。

必须使用AjaxRequestTarget更新浏览器端的HTML元素。通过向
selection
添加/删除元素,您可以在服务器端更改
ClassChoice
的模型。在AjaxFormChoiceComponentUpdatingBehavior#onUpdate()的底部,您应该执行
target.add(this)
,告诉Wicket使用新的选择/模型重新绘制此ClassChoice实例

确保调用
setOutputMarkupId(true)