首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FontMetrics生成NullPointerException

FontMetrics生成NullPointerException
EN

Stack Overflow用户
提问于 2013-03-13 14:38:28
回答 1查看 1K关注 0票数 3

我为Java中的一个记账程序创建的GUI的一部分需要显示不同的字符串。在显示此字符串之前,必须在适当的位置添加换行符。为此,我创建了一个扩展JTextArea的类,并覆盖了setText()方法:

代码语言:javascript
复制
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");
}
}

为了代替"// FontMetrics",我尝试了几种不同的方法。一开始我试着用“FontMetrics”创建一个新的对象...

代码语言:javascript
复制
fm = new FontMetrics();

...only发现你不能用这种方式实例化FontMetrics。我尝试使用getFontMetrics(字体)检索FontMetrics对象,从这个问题的答案中获取默认的swing字体:

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

我的代码看起来像这样:

代码语言:javascript
复制
fm = getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));

这抛出了一个NullPointerException。我也试过了:

代码语言:javascript
复制
fm = getGraphics().getFontMetrics(UIManager.getDefaults().getFont("TabbedPane.font"));

这也给了我一个NullPointerException。也许我不了解如何使用FontMetrics。任何洞察力都是值得欣赏的。

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

EN

回答 1

Stack Overflow用户

发布于 2013-03-13 15:04:44

要确定问题是什么,您应该尝试将抛出异常的物理行中的每一条逻辑行分开。例如,

代码语言:javascript
复制
UIDefaults uiDefaults = UIManager.getDefaults();
Font font = uiDefaults.getFont("TabbedPane.font");
Graphics graphics = getGraphics();
fm = graphics.getFontMetrics(font);

我怀疑问题在于UI默认设置中没有注册"TabbedPane.font“键的字体。为了克服这个问题,您应该能够通过Component#getFont方法直接从您的组件获取字体。不管怎样,这才是你真正想要的字体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15378579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档