我正在为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。
答案 0 :(得分:0)
要确定问题所在,您应该尝试分离抛出异常的物理行中的每条逻辑行。例如,
UIDefaults uiDefaults = UIManager.getDefaults();
Font font = uiDefaults.getFont("TabbedPane.font");
Graphics graphics = getGraphics();
fm = graphics.getFontMetrics(font);
我怀疑问题是UI默认值中没有使用“TabbedPane.font”键注册的字体。为了克服这个问题,您应该能够通过Component#getFont
方法直接从组件中获取字体。这真的是你想要的字体。