ひっきぃのメモ帳

趣味で作るプラモデル製作の過程と作品、日々の資格取得へ向けての活動、Apple中心のIT関連ネタを書いています。

[]第22回 長い文字列の表示

第22回では長い文字列の表示方法についてです。

ヘルプ画面等で、長い文章を画面に表示したい場面が多々ありますね。

普通に文字列を表示する命令 drawString を使ってこう書くと、

  str = "このような長い文字列では、一行に収まりません。画面からはみ出る前に次の行に表示した方がよいですね。";
  g.drawString(str,0,100);
     ※プログラム中で strは改行無しで書きます。
長い文字列1

画面の途中で切れてしまいます。

 

 

幅を考えて適当に文字列を分割して書けば回避できますが、ちょっと面倒です。

そんなときのために、こんな命令があります。
   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());
長い文字列2

このように画面からはみ出る前に、次の行へ進んですべてが表示されます。(下段)

 

 

簡単な解説は続きを読んでください。

以下に簡単な解説を書きます。

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;           //表示位置の高さを進める