生成两个多选框ListMultipleChoice,第二个多选框的值要随第一个框的选择情况而动态生成。
Html代码:
<!-- size=8 意为下拉框一次可以显示的数据条数为8 multiple="multiple" 表明这是多选下拉框-->
<form wicket:id="firstForm">
<select multiple="multiple" size="8" wicket:id="allDepartment"></select>
<select multiple="multiple" size="8" wicket:id="userPart"></select>
</form>
细节说明(数据准备):
1.第一个框显示团队信息,下拉框为deptSelect
*填充第一个框的数据源为List《UserDepartment》 listDepartment
*UserDepartment类中有两个属性name和Id
2.第二个框显示团队成员信息,下拉框为userSelect
*填充第二个框的数据源为List《User》 listUser
*User类中有两个属性name和id
java代码:
public class Page{
//表单控件
private Form queryForm;
//定义团队多选框和参与者多选框
private ListMultipleChoice<UserDepartment> deptSelect;
private ListMultipleChoice<User> userSelect;
//选中的团队Id列表 //选中的用户Id列表
private ArrayList<Integer> departmentIds = new ArrayList<Integer>();
private ArrayList<Integer> userIds =new ArrayList<Integer>();
//定义存储动态得到的User集合
private ArrayList<User> listUser;
public Page(){
queryForm=new Form("firstForm");
this.add(queryForm);
//团队下拉列表框和参与者下拉列表框的初始化
//先定义一个空list<User>,目的是在没有选择任何团队时,参与者选择框无法完成初始化而报错。
deptSelect = createDeptSelect("allDepartment");
userSelect = createUserSelect("userPart",new ArrayList<User>());
queryForm.add(deptSelect);
queryForm.add(userSelect);
}
//编写团队多选框的生成方法
private ListMultipleChoice<UserDepartment> createDeptSelect(String id) {
//参数1:key(显示) 参数2:value(隐藏) 其实两个参数都是从数据库中获取的列,存在了预定义对象对应的变量中
ChoiceRenderer choiceRenderer = new ChoiceRenderer("name" ,"departmentId" );
List<UserDepartment> listDepartment=你的数据,返回集合
final ListMultipleChoice<UserDepartment> teamSelect =
new ListMultipleChoice(id,new Model<UserDepartment>(), listDepartment,choiceRenderer);
//获得当前选中项
teamSelect.add(new AjaxFormComponentUpdatingBehavior("onChange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
//将选择后的值转换成字符串
String ss=teamSelect.getModelValue();
if(ss!=null) {
//去除";"符,转换成字符串数组
String[] ssTr = ss.split(";");
//将上一个点击事件的内容删除,确保每次点击只能获取当下的结果
departmentIds.clear();
for (int i = 0; i < ssTr.length; i++) {
//将点击的结果加入到列表中,用于数据库查询 departmentIds.add(Integer.parseInt(ssTr[i]));
}
//根据departmentIds里的值来动态查询,生成listUser
listUser = getAllUser(departmentIds);
userSelect = createUserSelect("userPart", listUser);
userSelect.setOutputMarkupId(true);
this.addOrReplace(userSelect);
target.add(userSelect);
}
}
});
return teamSelect;
}
//编写参与者多选框的生成方法
private ListMultipleChoice<User> createUserSelect(String id,List<User> userBeanList) {
//name和userId为User类的两个属性
ChoiceRenderer choiceRenderer = new ChoiceRenderer("name" ,"userId" );
final ListMultipleChoice<User> userSelect = new ListMultipleChoice(id,new Model<User>(), userBeanList,choiceRenderer);
/*当重新选择团队时,并没有想选择参与者时,也就是没有发生参与者的点击事件,必须要把之前保存参与者的id清空,否则结果会错误*/
userIds.clear();
userSelect.add(new AjaxFormComponentUpdatingBehavior("onChange") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
String ss=userSelect.getModelValue();
if(ss!=null){
String[] uss=ss.split(";");
for(int i=0;i<uss.length;i++){
//同样可以获取选中的成员Id,如果以后可以用到的话。
userIds.add(Integer.parseInt(uss[i]));
}
}
}
});
return userSelect;
}
}