第22回
では長い文字列の表示方法についてです。
ヘルプ画面等で、長い文章を画面に表示したい場面が多々ありますね。
普通に文字列を表示する命令 drawString を使ってこう書くと、
str = "このような長い文字列では、一行に収まりません。画面からはみ出る前に次の行に表示した方がよいですね。";
g.drawString(str,0,100);
※プログラム中で strは改行無しで書きます。
画面の途中で切れてしまいます。
幅を考えて適当に文字列を分割して書けば回避できますが、ちょっと面倒です。
そんなときのために、こんな命令があります。
getLineBreak
これは、幅を指定して何文字目までが画面に入るかを調べるメソッドです。
ちゃんと使うにはちょっと面倒ですが、DoJAのAPIドキュメントにサンプルが載っています。ドキュメントはちゃんと読まないとだめですね。
そのまま載せると、
public void drawText(Graphics g, Font f, String str, int x, int y, int width) {
int len = str.length();
char data = new char[len];
str.getChars(0, len, data, 0);
int startIdx = 0;
int endIdx = 0;
int h = f.getHeight();
while (len > 0) {
endIdx = f.getLineBreak(str, startIdx, len, width);
g.drawChars(data, x, y, startIdx, endIdx - startIdx);
len -= (endIdx - startIdx);
startIdx = endIdx;
y += h;
}
}
これを次のように呼び出すと、
drawText(g,f,str,0,120,Display.getWidth());
このように画面からはみ出る前に、次の行へ進んですべてが表示されます。(下段)
簡単な解説は続きを読んでください。
以下に簡単な解説を書きます。
int len = str.length(); //文字の長さを取得
char data = new char[len]; //文字数分の配列を確保して
str.getChars(0, len, data, 0); //文字列のコピーを文字配列に作成
int startIdx = 0; //最初の文字の位置と
int endIdx = 0; //最後の文字の位置を初期化
int h = f.getHeight(); //改行するための文字列の高さを取得
while (len > 0) { //文字の終わりまで繰り返し
endIdx = f.getLineBreak(str, startIdx, len, width); //改行位置を探す
g.drawChars(data, x, y, startIdx, endIdx - startIdx); //開始位置から終了位置までの文字を画面に表示
len -= (endIdx - startIdx); //表示した分の長さを減らし
startIdx = endIdx; //次の開始位置を設定し
y += h; //表示位置の高さを進める