【问题标题】:How to uncheck another checkbox (which is defined after the main checkbox) if the main checkbox is unchecked如果未选中主复选框,如何取消选中另一个复选框(在主复选框之后定义)
【发布时间】:2021-11-23 15:48:34
【问题描述】:

我有两个这样的复选框:

CheckBox checkBox1 = new AjaxCheckBox("enableCheckBox1", new PropertyModel<Boolean>(channelModel, "checkBox1")) {

    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        if (!getModelObject()) {
           // How can I uncheck checkBox2 when checkBox1 is unchecked
           checkBox2.setModelObject(false); // compilation error as checkBox2 is defined after this line.
           target.add(checkBox2); // same compilation error
        }
    }
};

CheckBox checkBox2 = new AjaxCheckBox("enableCheckbox2", new PropertyModel<Boolean>(channelModel, "checkBox2")) {

    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        if (getModelObject()) {
           checkBox1.setModelObject(true);
           target.add(checkBox1);
        }
    }
};

当我检查 checkBox2 时,我希望自动检查 checkBox1,这是我能够做到的。但是,如果我想在 checkBox1 未选中的情况下取消选中 checkBox2,我该怎么做?我遇到编译错误,因为 checkBox2 是在使用它的行之后定义的。除了调用实例之外,还有其他方法可以获取 checkBox 属性吗?

【问题讨论】:

    标签: java checkbox wicket


    【解决方案1】:

    最简单的解决方案是让这两个复选框成为组件的实例成员:

    private CheckBox checkBox1;
    private CheckBox checkBox2;
    
    public YourComponent() {
      checkBox1 = ...;
      checkBox2 = ...;
    }
    

    【讨论】:

    【解决方案2】:
    CheckBox checkBox1 = null;
    CheckBox checkBox2 = null;
    
    checkBox1 = new AjaxCheckBox("enableCheckBox1", new PropertyModel<Boolean>(channelModel, "checkBox1")) {
    
      @Override
      protected void onUpdate(AjaxRequestTarget target) {
        if (!getModelObject()) {
           // How can I uncheck checkBox2 when checkBox1 is unchecked
           checkBox2.setModelObject(false); // compilation error as checkBox2 is defined after this line.
           target.add(checkBox2); // same compilation error
        }
      }
    };
    
    
    checkBox2 = new AjaxCheckBox("enableCheckbox2", new PropertyModel<Boolean>(channelModel, "checkBox2")) {
    
      @Override
      protected void onUpdate(AjaxRequestTarget target) {
        if (getModelObject()) {
           checkBox1.setModelObject(true);
           target.add(checkBox1);
        }
      }
    };
    

    【讨论】:

    • 这行不通,因为它会在checkBox2.setModelObject(false); 行出现编译错误,因为 checkBox2 尚未初始化。
    • 我进行了编辑,在前两行添加了checkbox = null。这应该可行!
    • 同样,由于checkBox没有初始化,checkBox2.setModelObject(false);仍然会显示编译错误。
    • 不,不会的! onUpdate() 的调用比初始化晚得多。请创建一个演示应用程序并在 GitHub/BitBucket/... 分享
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多