FontMetrics生成NullPointerException

时间:2013-03-13 06:38:28

标签: java null nullpointerexception fontmetrics

我正在为Java中的簿记程序创建的GUI的一部分需要显示各种String。在显示此String之前,它必须在适当的位置添加换行符。为此,我创建了一个扩展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。任何见解都很受欢迎。

编辑:好的,现在我再次尝试了上面两个片段,用getFont()取代了UIManager.getDefaults()。getFont(...)。抛出相同的NullPointerException。

1 个答案:

答案 0 :(得分:0)

要确定问题所在,您应该尝试分离抛出异常的物理行中的每条逻辑行。例如,

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

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