【问题标题】:Stackoverflow exception in blackberry CheckBoxField黑莓 CheckBoxField 中的 Stackoverflow 异常
【发布时间】:2012-12-14 07:58:57
【问题描述】:

我正在实现一个简单的应用程序,用户可以在注册页面中选择新闻类别。要求如下

  1. 所有类别都是 CheckBoxField 的。用户必须至少选择一个类别。
  2. 全选复选框将允许选择所有/取消选择所有类别复选框。
  3. 如果用户手动选择所有复选框字段,则必须选中“全选”复选框。

方法:我在循环中创建了类别复选框。

for(int i=0;i<interests.length;i++){
    allFields[i] = new ColorCheckBoxField(interests[i], false, checkBoxStyle | USE_ALL_WIDTH);
    allFields[i].setCookie(i+"");
    allFields[i].setFont(bodyFont);
    allFields[i].setChangeListener(new FieldChangeListener() {
         public void fieldChanged(Field field, int context) {
            ColorCheckBoxField tempChoice = (ColorCheckBoxField)field;
            int index =Integer.parseInt(tempChoice.getCookie().toString().trim());
            //set the selection
            if(tempChoice.getChecked()){
                parent.selectInterest(index);
            }

            boolean flag = true;
            int[] intrests = parent.getSelectedInterest();
            for (int i = 0; i < intrests.length; i++) {                     
                if(intrests[i]==0){
                    flag = false;
                }
            }

            if(flag==true){
                selectAll.setChecked(flag); // select all is Checkbox object
            }else{
                selectAll.setChecked(false);
            }
        }
    });
    vfm.add(allFields[i]);
} 

我的 selectAll 复选框逻辑是

        selectAll = new ColorCheckBoxField("Select All", false, checkBoxStyle | USE_ALL_WIDTH);
        selectAll.setChangeListener(new FieldChangeListener() {         
            public void fieldChanged(Field field, int context) {
                ColorCheckBoxField temp = (ColorCheckBoxField) field;
                //if (context == FieldChangeListener.PROGRAMMATIC ) {
                    checkAll(temp.getChecked()); // it loops through all checkbox and set them checked
                //}
            }
        }); 

        innerHfm.add(selectAll);

我理解这个问题,它是由于无限循环。我使用了“FieldChangeListener.PROGRAMMATIC”,但这无济于事,因为我希望现场侦听器既实用又手动地工作。我没有任何选择可以修复。有什么技巧可以帮助我吗?

【问题讨论】:

    标签: blackberry java-me blackberry-jde


    【解决方案1】:

    您必须使用FieldChangeListener.PROGRAMMATIC 是正确的。但是您必须将其与兴趣复选框一起使用,而不是将其用于selectAll 复选框。

    请在FieldChangeListener 中添加一项防御性检查以获取兴趣复选框:

    if ( nonProgrammaticChange(context) ) {
       ColorCheckBoxField tempChoice = (ColorCheckBoxField)field;
       int index = Integer.parseInt(tempChoice.getCookie().toString().trim());
       ...
    }
    

    nonProgrammaticChange 在哪里:

    private boolean nonProgrammaticChange (int context) {
        return (context & FieldChangeListener.PROGRAMMATIC) != FieldChangeListener.PROGRAMMATIC;
    }
    

    我在您的代码中看到了错误 - 如果未选中复选框,您对父级没有明确的兴趣。

    对我来说,小改进 - 使用 Vector 存储选定复选框的索引。这将允许替换此代码:

    boolean flag = true;
    int[] intrests = parent.getSelectedInterest();
    for ( int i = 0; i < intrests.length; i++ ) {                     
         if( intrests[i] == 0 ) {
              flag = false;
         }
    }
    

    到此代码:

    selectedInterestIndexes.size() == interests.length
    

    这可能会减少你在其他地方的迭代次数。

    此外,我还会在删除重复项和代码可读性方面做更多工作。

    【讨论】:

    • @Eugen.. 绝对是 +1 答案。你拯救了我的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多