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)