gpt4 book ai didi

java - CheckboxField 在 Blackberry java 应用程序中给出 StackOverflow 错误

转载 作者:行者123 更新时间:2023-12-01 14:04:52 27 4
gpt4 key购买 nike

我正在屏幕中创建 2-3 个复选框字段,并将它们添加到垂直字段管理器中。这里的想法是在单击另一个复选框时禁用其他复选框。但它给了我 stackoverflow 错误。我在这里发布我的代码...

final CheckboxField[] checkBoxField = new CheckboxField[2];
checkBoxField[0] = cashCardCheckboxField;
checkBoxField[1] = creditDebitCardCheckboxField;

checkBoxField[0].setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {

if(context != FieldChangeListener.PROGRAMMATIC){ //It means manually clicked by User
if(checkBoxField[0].getChecked()){
checkBoxField[0].setChecked(false);
}else{
checkBoxField[0].setChecked(true);
//Please wait Screen starts
// call here a user defined function to populate the drop down list
//Please wait Screen ends
}
}else{
checkBoxField[0].setChecked(false);
}
}
});

checkBoxField[1].setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {

if(context != FieldChangeListener.PROGRAMMATIC){ //It means manually clicked by User

if(checkBoxField[1].getChecked()){
checkBoxField[1].setChecked(false);
}else{
checkBoxField[1].setChecked(true);
//Please wait Screen starts
// call here a user defined function to populate the drop down list
//Please wait Screen ends
}

}else{
checkBoxField[1].setChecked(false);
}

}
});

感谢和问候。

最佳答案

解决方案

尝试使用此代码。它允许您创建任意数量的复选框。当选中一个时,监听器将取消选中所有其他选项。

public class CheckBoxScreen extends MainScreen {

private CheckboxField checkBoxField[];

public CheckBoxScreen() {
super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);

checkBoxField = new CheckboxField[3];
checkBoxField[0] = new CheckboxField("one", true); // checked by default
checkBoxField[1] = new CheckboxField("two", false);
checkBoxField[2] = new CheckboxField("three", false);

FieldChangeListener listener = new CheckboxListener();

for (int i = 0; i < checkBoxField.length; i++) {
checkBoxField[i].setChangeListener(listener);
add(checkBoxField[i]);
}
}

private class CheckboxListener implements FieldChangeListener {

public void fieldChanged(Field field, int context) {

if (context != FieldChangeListener.PROGRAMMATIC) {
// user modified this field
CheckboxField checkbox = (CheckboxField)field;
if (checkbox.getChecked()) {
// uncheck the other checkboxes
for (int i = 0; i < checkBoxField.length; i++) {
if (checkBoxField[i] != checkbox && checkBoxField[i].getChecked()) {
checkBoxField[i].setChecked(false);
}
}
}
} else {
// nothing more to do here ... this time, fieldChanged() is being
// called as a result of calling setChecked() in the code.
}
}
}
}

为什么你的代码会造成堆栈溢出

只要字段的属性被修改,就会调用 fieldChanged() 方法。对于 CheckboxField,当选中或取消选中字段时会发生这种情况。发生这种情况的原因可能是用户选中/取消选中该字段,或者是因为您的代码调用setChecked(boolean)。这一行:

if(context != FieldChangeListener.PROGRAMMATIC){  //It means manually clicked by User

允许 fieldChanged() 内的代码确定此调用是否由于用户更改了字段而发生,或者因为 setChecked() 被您的代码调用。不幸的是,您在 if 语句的所有分支中都调用了 setChecked(),这会导致用户同时调用 setChecked()事件,以及当您的代码更改字段时。

在此代码中:

    checkBoxField[0].setChangeListener(new FieldChangeListener() {
public void fieldChanged(Field field, int context) {

if(context != FieldChangeListener.PROGRAMMATIC){ //It means manually clicked by User
if(checkBoxField[0].getChecked()){
checkBoxField[0].setChecked(false);
}else{
checkBoxField[0].setChecked(true);
//Please wait Screen starts
// call here a user defined function to populate the drop down list
//Please wait Screen ends
}
}else{
checkBoxField[0].setChecked(false);
}
}
});

最后一行 (checkBoxField[0].setChecked(false);) 导致了问题。在 if 语句的“手动单击”分支中调用 setChecked() 后,会到达该 else 分支。再次调用 setChecked(false) 后,您就已以编程方式修改了该字段。这将导致 fieldChanged() 被再次回调。然后再次。然后再次。这个循环永远不会停止,直到程序堆栈已满并且您的应用程序崩溃。

因此,如果您看到我的代码,您会注意到我没有在 if 语句的编程分支中调用 setChecked() 。代码中的另一个问题是,当选中复选框 0 时,您没有正确的逻辑来取消选中复选框 1。但是,这只是一个功能错误。对 fieldChanged() 的递归调用是导致堆栈溢出的原因。

希望有帮助。

关于java - CheckboxField 在 Blackberry java 应用程序中给出 StackOverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982886/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com