3

我为 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 字体:

如何获得 Swing JTabbedPane 标签的默认字体?

我的代码如下所示:

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

这引发了 NullPointerException。我也试过:

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

这也给了我一个 NullPointerException。也许我不明白如何使用 FontMetrics。任何见解都会受到赞赏。

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

4

1 回答 1

0

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

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

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

于 2013-03-13T07:04:44.083 回答