Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

FontMetrics#stringWidth(String)について

文字列の描画幅を調べるために以下のソースを実行した結果、再帰的な無限ループが発生してしまい、StackOverflowErrorをはいてしまいました。

Font font = new Font(Font.DIALOG,Font.PLAIN,100);
FontMetrics fm = new FontMetrics(font){ } ;
System.out.println(fm.stringWidth("Java"));

エラーの内容を追った結果、FontMetrics#stringWidth(String) ⇒ FontMetrics#charsWidth(char[],int,int) ⇒ FontMetrics#stringWidth(String)のループになってしまっているようです。
解決策が分かる方、ご教授頂けると幸いです。

3

回答

8229

閲覧

3件の回答

評価

0

FontMetrics#getStringBounds(String, Graphics)で、
Rectangle2Dを取得してみては。

評価

0

サブクラスについての注意
http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/F
ontMetrics.html

Graphicsオブジェクトを取得できるなら
http://java.sun.com/javase/ja/6/docs/ja/api/java/awt/G
raphics.html#getFontMetrics(java.awt.Font)

評価

0

>Graphicsオブジェクトを取得できるなら

完全に見落としてました。。。
ありがとうございます。以下のソースに変更した結果うまくいきました。

Font font = new Font(Font.DIALOG,Font.PLAIN,100);
image = new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
FontMetrics fm = g.getFontMetrics(font);
System.out.println(fm.stringWidth("Java"));

>FontMetrics#getStringBounds(String, Graphics)で、Rectangle2Dを取得してみては。

これは便利ですね。今後使わせて頂きます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。