【问题标题】:Getting FontMetrics StackOverflowError获取 FontMetrics StackOverflowError
【发布时间】:2014-04-06 08:12:23
【问题描述】:

运行以下代码:

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)

在 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.java:430)

等等……

为什么?

【问题讨论】:

  • 你不能只创建一个new FontMetrics,你需要从某个地方获取一个。你没有在 EDT 中运行,也没有 Swing 组件——字体没有被渲染,那么它怎么会有宽度?
  • 谢谢。它帮助我找到了解决方案

标签: java fonts awt stack-overflow fontmetrics


【解决方案1】:

来自the doc

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

这个:

FontMetrics metrics  = new FontMetrics(myFontTest) {};

定义一个没有任何方法被覆盖的子类,因此你看到的行为。

【讨论】:

    【解决方案2】:

    这是一个解决方案:
    (请参阅用户 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);
    
        }
    
    }
    

    【讨论】:

    • 我的名声太小,现在不能这样做。我得等到明天。
    【解决方案3】:

    重写你的代码如下:

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

    【讨论】:

    • 使用框架比使用画布更好吗? (见我自己的答案)
    • 根据文档getToolkit().getFontMetrics(myFontTest) 是一种已弃用的方法。但是,我认为如果您使用它会更好。参考 canvas.getFontMetrics 方法的文档。
    猜你喜欢
    • 2013-02-28
    • 2012-05-03
    • 1970-01-01
    • 2021-03-11
    • 2017-05-07
    • 1970-01-01
    • 2013-11-04
    • 2011-02-20
    • 2019-11-05
    相关资源
    最近更新 更多