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的主要内容,如果未能解决你的问题,请参考以下文章
Android踩坑日记:Android字体属性及测量(FontMetrics)
在 Android 设备上运行时,FontMetrics 不正确。模拟器不错