【问题标题】:FontMetrics generates NullPointerExceptionFontMetrics 生成 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。依赖或普遍使用此方法是一种不好的做法。因此,虽然“从不”可能有点苛刻,但通常应该避免使用。

标签: java null nullpointerexception fontmetrics


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2012-07-04
    • 2021-09-20
    • 2012-07-07
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多