我为 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。