我为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");
}
}为了代替"// FontMetrics",我尝试了几种不同的方法。一开始我试着用“FontMetrics”创建一个新的对象...
fm = new FontMetrics();...only发现你不能用这种方式实例化FontMetrics。我尝试使用getFontMetrics(字体)检索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。任何洞察力都是值得欣赏的。
编辑:好了,现在我已经再次尝试了上面的两个代码片段,替换了UIManager.getDefaults().getFont(...)使用getFont()。抛出相同的NullPointerException。
发布于 2013-03-13 15:04:44
要确定问题是什么,您应该尝试将抛出异常的物理行中的每一条逻辑行分开。例如,
UIDefaults uiDefaults = UIManager.getDefaults();
Font font = uiDefaults.getFont("TabbedPane.font");
Graphics graphics = getGraphics();
fm = graphics.getFontMetrics(font);我怀疑问题在于UI默认设置中没有注册"TabbedPane.font“键的字体。为了克服这个问题,您应该能够通过Component#getFont方法直接从您的组件获取字体。不管怎样,这才是你真正想要的字体。
https://stackoverflow.com/questions/15378579
复制相似问题