-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

10 / 01
Tue

Graphics クラスの drawString メソッドって、 単に文字列を描画するだけじゃないですか。 そうすると、 例えば RPG で、 この 200px の間の中にクエスト情報なんかを描画したいってときに、 普通に描画するとはみ出ますよね。 それで、 幅が 200px になったところで自動的に改行してくれるような機能があると便利ですよね。 ということで、 そういうことをしてくれるメソッドを作りました。

private void paintFixedString(Graphics graphics, String string, Integer x, Integer y, Integer width, Integer height) {
  Integer i = 0;
  Integer cx = x;
  Integer cy = y;
  Integer length = string.length();
  String paintedString = "";
  for (; i < length; i ++) {
    Character current = string.charAt(i);
    String currentString = current.toString();
    if (currentString.matches("\\w")) {
      paintedString += currentString;
      continue;
    } else if (!paintedString.equals("")) {
      paintedString += currentString;
    }
    if (i + 1 < length) {
      Character next = string.charAt(i + 1);
      String nextString = next.toString();
      if (next.equals(',') || next.equals('.') || next.equals('、') || next.equals('。') || next.equals('」') || next.equals('』')) {
        if (paintedString.equals("")) {
          paintedString += currentString + nextString;
        } else {
          paintedString += nextString;
        }
        i ++;
      }
    }
    if (paintedString.equals("")) {
      paintedString += currentString;
    }
    Integer px = graphics.getFontMetrics().stringWidth(paintedString);
    if (cx + px > x + width && paintedString.equals(" ")) {
      paintedString = "";
      continue;
    }
    if (cx + px > x + width && (paintedString.equals("「") || paintedString.equals("『"))) {
      cx = x - px / 2;
      cy += height;
    } else if (cx + px > x + width) {
      cx = x;
      cy += height;
    }
    graphics.drawString(paintedString, cx, cy);
    cx += px;
    paintedString = "";
  }
}

引数の width に収めたい幅を入れると、その幅に収まるように自動的に改行しながら文字列を出力します。 それに加えて、 閉じカッコが行頭に来ないようにするなどの禁則処理も行ってくれます。 さらに、 英単語はちゃんと単語の途中で改行されないようにもなっています。

コードの解説はちょっと複雑なのでまた今後にしますが、 なかなか便利です。 ただ、 本当はこれを Graphics クラスに定義したかったんですよね・・・。 そうすれば、 graphics.paintFixedString( ~ ) みたいに書けるんですが。 Java は既存のクラスにメソッドを定義することができないので、 仕方ないです。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。