Assume you have the following attributes:
String [] message;
int messageFirstLineShown;
Command nextCommand;
First you will have to break your message in lines that fit the screen.
char[] chars = ("My long text that will not fit the screen with just one line.\n"
+ "Second line.\nThird line").toCharArray();
StringBuffer buffer = new StringBuffer();
Vector vLines = new Vector();
for (int i = 0; i < chars.length; i++) {
if (chars[i] == ' ' || chars[i] == '.') {
String s = buffer.toString();
// filled a line
if (Font.getDefaultFont().stringWidth(s) > getWidth()) {
vLines.addElement(s.substring(0, s.lastIndexOf(' ')));
buffer.setLength(0);
buffer.append(s.substring(s.lastIndexOf(' ') + 1));
}
buffer.append(chars[i]);
} else if (chars[i] == '\n') {
vLines.addElement(buffer.toString());
buffer.setLength(0);
} else {
buffer.append(chars[i]);
}
}
vLines.addElement(buffer.toString());
this.message = new String[vLines.size()];
vLines.copyInto(this.message);
this.messageFirstLineShown = 0;
When the time comes when you need to paint the message, use the following code:
int y = 0;
for (int i = this.messageFirstLineShown; i < message.length; i++) {
g.drawString(this.message[i], 0, y, Graphics.LEFT | Graphics.TOP);
y += g.getFont().getHeight();
}
If you have more lines in message than the screen can show, you will need to add a nextCommand = Command("Next", Command.OK, 1) to increase the value of messageFirstLineShown.
To know if this is the case check if ((getHeight() / Font.getDefaultFont().getHeight()) > message.length) and at commandAction add the following treatment:
int maxLines = this.getHeight() / Font.getDefaultFont().getHeight();
int remainingLines = this.message.length - this.messageFirstLineShown;
this.messageFirstLineShown += maxLines;
if (remainingLines < maxLines) {
this.removeCommand(nextCommand);
}
No comments:
Post a Comment