获取FontMetrics StackOverflowError

时间:2014-03-04 16:48:15

标签: java fonts awt stack-overflow fontmetrics

运行以下代码:

import java.awt.Font;
import java.awt.FontMetrics;

public class MetricsTest {

    public static void main(String[] args) {
                Font myFontTest=new Font("Arial", Font.PLAIN, 11);
                FontMetrics metrics  = new FontMetrics(myFontTest) {};
                int characterWidth=metrics.charWidth('A');
                System.out.println(characterWidth);
    }
}

产生此错误:

线程“main”中的异常java.lang.StackOverflowError

at java.awt.FontMetrics.getWidths(FontMetrics.java:430)

at java.awt.FontMetrics.charWidth(FontMetrics.java:333)

at java.awt.FontMetrics.getWidths(FontMetrics.java:430)

at java.awt.FontMetrics.charWidth(FontMetrics.java:333)

at java.awt.FontMetrics.getWidths(FontMetrics.java:430)

依旧......

为什么?

3 个答案:

答案 0 :(得分:3)

来自the doc

  

对子类的注意事项:由于这些方法中的许多方法是相互封闭的   递归循环,你必须注意你实现至少一个   每个这样的循环中的方法可以防止你的无限递归   使用子类。特别是,以下是最小的   建议的一组方法来覆盖,以确保正确性   并防止无限递归(尽管其他子集是相同的   可行):

此:

FontMetrics metrics  = new FontMetrics(myFontTest) {};

定义了一个子类,没有重写任何方法,因此你看到的行为。

答案 1 :(得分:1)

这是一个解决方案:
(请参阅用户Boris the Spider的评论)在我原来的帖子上)

import java.awt.Canvas;
import java.awt.Font;
import java.awt.FontMetrics;

public class MetricsTest {

    public static void main(String[] args) {
                Font myFontTest=new Font("Arial", Font.PLAIN, 11);
                Canvas c = new Canvas();
                FontMetrics fm = c.getFontMetrics(myFontTest);
                int characterWidth=fm.charWidth('A');
                System.out.println(characterWidth);

    }

}

答案 2 :(得分:1)

重写您的代码如下:

try {
    Font myFontTest=new Font("Arial", Font.PLAIN, 11);
    Frame f = new Frame();
    //FontMetrics metrics = f.getToolkit().getFontMetrics(myFontTest);      
    FontMetrics metrics = Toolkit.getDefaultToolkit().getFontMetrics(myFontTest);

    int characterWidth=metrics.charWidth('A');
    System.out.println(characterWidth);
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}