2014-03-04 19 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