[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
.



Relevant Pages

  • Re: Printing man pages in A4 paper
    ... > file formated for letter paper. ... The groff home page, ... the command "man -t setfont" will ...
    (Fedora)
  • RE: [SLE] The setfont command
    ... I'm not very familiar w/ using setfont, but if you haven't already, look ... - it gives the various options, font directories, etc. ... I've been trying to Russify my computer. ... how the frell do I use the "setfont" command? ...
    (SuSE)
  • Printing man pages in A4 paper
    ... command "man -t setfont" outputs a PostScript ... file formated for letter paper. ...
    (Fedora)