主复选框未勾选时如何取消勾选后续定义的另一个复选框
解决方案
你可以通过以下几种常用方式解决变量顺序导致的编译问题:
方案1:提前声明组件变量(最简方案)
Java匿名内部类仅要求引用的外部变量为有效final(即仅赋值一次),你可以先声明两个组件变量,再分别完成实例化即可:
// 先声明变量,满足编译阶段的引用要求 CheckBox checkBox1, checkBox2; checkBox1 = new AjaxCheckBox("enableCheckBox1", new PropertyModel<Boolean>(channelModel, "checkBox1")) { @Override protected void onUpdate(AjaxRequestTarget target) { if (!getModelObject()) { checkBox2.setModelObject(false); target.add(checkBox2); } } }; // 此处将checkBox1添加到父容器,例如 form.add(checkBox1); checkBox2 = new AjaxCheckBox("enableCheckbox2", new PropertyModel<Boolean>(channelModel, "checkBox2")) { @Override protected void onUpdate(AjaxRequestTarget target) { if (getModelObject()) { checkBox1.setModelObject(true); target.add(checkBox1); } } }; // 此处将checkBox2添加到父容器,例如 form.add(checkBox2);
注:
onUpdate是前端交互触发的回调,运行时两个组件已经完成实例化并加入组件树,不会出现空指针问题。
方案2:解耦组件依赖,直接操作模型+通过组件树获取实例
不需要互相持有组件引用,直接修改绑定的业务模型属性,再通过组件ID从父容器中获取需要更新的组件即可:
CheckBox checkBox1 = new AjaxCheckBox("enableCheckBox1", new PropertyModel<Boolean>(channelModel, "checkBox1")) { @Override protected void onUpdate(AjaxRequestTarget target) { if (!getModelObject()) { // 直接修改绑定的业务模型属性 channelModel.setCheckBox2(false); // 按ID从父容器获取checkBox2实例,加入更新目标 target.add(getParent().get("enableCheckbox2")); } } }; // form.add(checkBox1); CheckBox checkBox2 = new AjaxCheckBox("enableCheckbox2", new PropertyModel<Boolean>(channelModel, "checkBox2")) { @Override protected void onUpdate(AjaxRequestTarget target) { if (getModelObject()) { channelModel.setCheckBox1(true); target.add(getParent().get("enableCheckBox1")); } } }; // form.add(checkBox2);
如果两个组件不在同一个直接父容器下,可以通过visitChildren方法遍历组件树查找对应ID的组件,也可以使用组件的完整路径进行查找。
内容的提问来源于stack exchange,提问作者caurangzeb
相关产品推荐
相关产品推荐

