martes, 18 de marzo de 2008

Problema con ChoiceGroup en Netbeans Mobility Pack

Me topé con un inconveniente al usar Netbeans Mobility Pack. La causa es el código que genera cuando creamos una lista en el editor visual de pantallas.
Cuando agregamos elementos a un ChoiceGroup se genera el siguiente código


public ChoiceGroup getCgToAccount() {
if (cgToAccount == null) {
// write pre-init user code here
cgToAccount = new ChoiceGroup("To Account", Choice.POPUP);
cgToAccount.append("Choice Element 1", null);
cgToAccount.append("Choice Element 2", null);
cgToAccount.setFitPolicy(Choice.TEXT_WRAP_DEFAULT);
cgToAccount.setSelectedFlags(new boolean[] { false, false });
cgToAccount.setFont(0, null);
cgToAccount.setFont(1, null);
// write post-init user code here
}
return cgToAccount;
}


Si más tarde debemos modificar la lista de valores con el método append(value, null), la aplicación falla mostrando :

java.lang.ArrayIndexOutOfBoundsException
at javax.microedition.lcdui.ChoiceGroup.insertImpl(ChoiceGroup.java:1377)
at javax.microedition.lcdui.ChoiceGroup.append(+25)


Esto aparentemente sería un bug de Java, el cual al llamar a .setFont de alguna forma "congela" el tamaño de la lista y no pueden agregarse nuevos elementos sin recibir el error. Hay un tema en el foro de SDN que explica este bug en detalle: CLDC and MIDP - Problem in changing List control's font.

Por suerte el problema no se presenta si no existe una llamada a .setFont así es que para el caso de NetBeans la solución es borrar todos los elementos del ChoiceGroup y agregarlos por código. Esto por supuesto en el caso de que necesitemos modificarlos durante la ejecución.

No hay comentarios: