FontMetrics 生成 NullPointerException

Posted

技术标签:

【中文标题】FontMetrics 生成 NullPointerException【英文标题】:FontMetrics generates NullPointerException 【发布时间】:2013-02-28 23:46:01 【问题描述】:

我为 Java 中的簿记程序创建的 GUI 的一部分需要显示不同的字符串。在显示此字符串之前,它必须在适当的地方添加换行符。为此,我创建了一个扩展 JTextArea 的类,并像这样重写了 setText() 方法:

public class ContentPane extends JTextArea 

private FontMetrics fm;

public ContentPane() 
    super();
    // Instatiate FontMetrics


public ContentPane(String string) 
    super(string);
    // Instatiate FontMetrics


@Override
public void setText(String text) 
    int n;
    String remainder;

    while (fm.stringWidth(text) > maxStringWidth()) 
        n = numberOfCharsToCut(text);
        remainder = text.substring(text.length() - n);
        text = text.substring(0, text.length() - n) + "\n" + remainder;
    

    super.setText(text);


private int numberOfCharsToCut(String str) 
    String newStr = str;
    int i = 0;
    while (fm.stringWidth(newStr) > maxStringWidth()) 
        newStr = str.substring(0, str.length() - i);
        i++;
    
    return i;


private int maxStringWidth() 
    return fm.stringWidth("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@lll");


代替“// Instatiate FontMetrics”,我尝试了一些不同的方法。起初我尝试使用“new”创建一个 FontMetrics 对象...

fm = new FontMetrics();

...只是发现您无法以这种方式实例化 FontMetrics。我尝试使用 getFontMetrics(font) 检索 FontMetrics 对象,从这个问题的答案中获取默认的 swing 字体:

How do I get the default font for Swing JTabbedPane labels?

我的代码如下所示:

fm = getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));

这引发了 NullPointerException。我也试过了:

fm = getGraphics().getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));

这也给了我一个 NullPointerException。也许我不明白如何使用 FontMetrics。非常感谢任何见解。

编辑:好的,现在我又再次尝试了上面的两个 sn-ps,将 UIManager.getDefaults().getFont(...) 替换为 getFont()。抛出相同的 NullPointerException。

【问题讨论】:

永远不要使用 getGraphics()!如果组件尚未绘制,这将返回 NULL。当您开始拨打电话时,可能尚未加载 UI 默认值。 @MadProgrammer 在这种情况下永远不会,或者永远不会? 这是一个难以回答的问题,因为它脱离了上下文。 getGraphics 为您提供用于渲染组件的最后一个图形上下文的副本。如果组件从未渲染到屏幕上,这将为 null。依赖或普遍使用此方法是一种不好的做法。因此,虽然“从不”可能有点苛刻,但通常应该避免使用。 【参考方案1】:

要确定问题出在哪里,您应该尝试将引发异常的物理行中的每个逻辑行分开。例如,

UIDefaults uiDefaults = UIManager.getDefaults();
Font font = uiDefaults.getFont("TabbedPane.font");
Graphics graphics = getGraphics();
fm = graphics.getFontMetrics(font);

我怀疑问题在于 UI 默认值中没有使用“TabbedPane.font”键注册的字体。为了克服这个问题,您应该能够通过Component#getFont 方法直接从您的组件中获取字体。无论如何,这确实是您想要的字体。

【讨论】:

以上是关于FontMetrics 生成 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

Java - 没有图形的 FontMetrics

Java:FontMetrics 上升不正确?

Android踩坑日记:Android字体属性及测量(FontMetrics)

在 Android 设备上运行时,FontMetrics 不正确。模拟器不错

自定义View之绘图篇:baseLine和FontMetrics

无法向 Kafka 集群生成 PubNub 数据流