2014-03-04 51 views
4

运行以下代码:获得的FontMetrics的StackOverflowError

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); 
    } 
} 

产生这样的错误:在螺纹

异常 “主” java.lang.StackOverflowError的

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

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

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

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

在java.awt.FontMetrics.getWidths(FontMetrics对象。):

等等。

+1

你不能只创建一个'新的FontMetrics'你需要从_somewhere_获取一个。您没有在EDT中运行,也没有Swing组件 - 字体未呈现,因此它如何具有宽度? –

+0

谢谢。它帮助我找到解决方案 – geo

回答

1

这里是一个解决方案:
(见用户鲍里斯蜘蛛评论)在我原来的职位)

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); 

    } 

} 
+0

如果这是您的解决方案,那么您可以将其标记为已接受,您知道 –

+0

我的声誉太小,无法做到这一点。我必须等到明天。 – geo

3

the doc

Note to subclassers: Since many of these methods form closed, mutually recursive loops, you must take care that you implement at least one of the methods in each such loop to prevent infinite recursion when your subclass is used. In particular, the following is the minimal suggested set of methods to override in order to ensure correctness and prevent infinite recursion (though other subsets are equally feasible):

此:

FontMetrics metrics = new FontMetrics(myFontTest) {}; 

定义没有覆盖任何方法的子类,因此,您所看到的行为。

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(); 
} 
+0

使用画布更好地使用框架? (请参阅我自己的答案) – geo

+0

根据文档'getToolkit()。getFontMetrics(myFontTest)'是一个不推荐的方法。但是,我认为如果可以使用它会更好。请参阅canvas.getFontMetrics方法的文档。 – Visruth