Jeg har lavet et j2me-program til min telefon, og fik nogle problemer da
jeg ville ændre skŕiftstørrelsen. Efter at have rodet med det et stykke
tid, finder jeg ud af - kort fortalt - at hvis jeg har en liste med 4
elementer, og ændrer fontstørrelsen på dem, og derefter tlføjer et 5.
element, så opstår der er en ArrayIndexOutOfBoundsException. Hvis jeg
ikke ændrer fontstørrelsen, så er der ingen problemer i at tilføje flere
elementer til listen.
Jeg har inkluderet et lille program der demonstrerer problemet, længere
nede i teksten. Vær opmærksom på, at det er j2me kode. setFont er en
metode til List - se
http://java.sun.com/javame/reference/apis/jsr118/javax/microedition/lcdui/
List.html
Nu er jeg jo bare en amatør, med et meget begrænset kendskab til java,
men jeg synes det ligner en bug. Gør jeg noget indlysende forkert? Er der
nogen der har et forslag til hvordan jeg kan løse problemet?
Hvis jeg kører test-programmet i Netbeans6.9 med WTK2.5.2 og JDK1.6.0.26
under Linux, får jeg følgende output:
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)
Hvis jeg bygger og kører med ktoolbar i WTK2.5.2, får jeg:
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)
Altså cirka det samme. Når jeg kører programmet på min Samsung B2100
telefon får jeg ingen errors, men den nye linie (list.append("test",
null)) bliver ikke tilføjet, og de efterfølgende list.setFont(i, f)
bliver ikke udført.
Okay, gode råd modtages...
-- 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 --
--
Thomas Jensen, Denmark
--
Thomas Jensen, Denmark