[J2ME] List and Font -- again
I have included a fully working example below. Basically, it shows that
if I use setFont on elements in a list, and then append another element
to the list, it throws an ArrayIndexOutOfBoundsException. If I delete
some or all the elements, I can add up to the same number of elements as
there were when I used setFont first time.
Please remember, this is J2ME code, setFont() is a method to List.
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/
List.html
To me, this looks like a bug. In the code below, I can succesfully use
setFont on elements already in the list, but appending a new element to
the list throws an exception. Not using setFont on the new element, but
just adding a new element to the list throws an exception. If I do not
use setFont there are - of course - no problems in appending elements to
a list.
Any ideas how to get around it? Do I really have to delete the list and
create a new one if I want to add new elements to the list?
-- CODE START --
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class listtest extends MIDlet implements CommandListener {
private Display display;
private List list;
private Command exitcmd, reloadcmd;
private Vector v;
Font f;
public void startApp() {
reloadcmd = new Command("Reload", Command.SCREEN, 1);
exitcmd = new Command("Exit", Command.EXIT, 2);
f = Font.getFont(0, 0, Font.SIZE_LARGE);
v = new Vector(1,1);
v.addElement("string1");
v.addElement("string2");
v.addElement("string3");
v.addElement("string4");
list = new List("", Choice.IMPLICIT);
list.addCommand(reloadcmd);
list.addCommand(exitcmd);
list.setCommandListener(this);
int i = 0;
for (Enumeration e = v.elements(); e.hasMoreElements(); i++ ) {
list.append((String)e.nextElement(), null);
// ArrayIndexOutOfBoundsException, if setting font here...
// list.setFont(i, f);
}
for (i=1 ; i<list.size() ; i++ ) { // not on first element
// It's okay here
list.setFont(i, f);
}
display = Display.getDisplay(this);
display.setCurrent(list);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction (Command c, Displayable d) {
if (c == reloadcmd) {
// list.deleteAll();
// for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
// list.append((String)e.nextElement(), null);
// }
list.append("test", null);
// for (i=0 ; i<list.size() ; i++ ) {
// if (!list.getFont(i).equals(f)){
// list.setFont(i, f);
// }
// }
display.setCurrent(list);
}
if (c == exitcmd) {
destroyApp(true);
notifyDestroyed();
}
}
}
-- CODE END --
When running the program in Netbeans6.9 with WTK2.5.2 and JDK1.6.0.26,
the exception says:
java.lang.ArrayIndexOutOfBoundsException
at javax.microedition.lcdui.ChoiceGroup.insertImpl(ChoiceGroup.java:1420)
at javax.microedition.lcdui.ChoiceGroup.append(ChoiceGroup.java:397)
at javax.microedition.lcdui.List.append(List.java:429)
at listtest.commandAction(listtest.java:70)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction
(Display.java:2093)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction
(Display.java:2929)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent
(DefaultEventHandler.java:297)
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent
(AutomatedEventHandler.java:667)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent
(DefaultEventHandler.java:711)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run
(DefaultEventHandler.java:608)
If if build and run with ktoolbar from WTK2.5.2, the exception says:
java.lang.ArrayIndexOutOfBoundsException
at javax.microedition.lcdui.ChoiceGroup.insertImpl(+456)
at javax.microedition.lcdui.ChoiceGroup.append(+25)
at javax.microedition.lcdui.List.append(+9)
at listtest.commandAction(+71)
at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.handleVmEvent
(+186)
at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+57)
When running the program on my Samsung B2100 phone, I get no errors, but
the new line is not appended (list.append("test", null);) and the 4
elements are all with standard size (not large, as 3 of them were before
running the reload command).
--
Thomas Jensen, Denmark