我爲Java中的簿記程序創建的GUI的一部分需要顯示不同的字符串。在顯示此字符串之前,必須在適當的位置添加換行符。要做到這一點,我已經創建延伸的JTextArea類,並覆蓋了setText()方法這樣:FontMetrics生成NullPointerException
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對象」的,我已經嘗試了一些不同的東西。起初,我試圖創建一個使用「新」的一個FontMetrics對象...
fm = new FontMetrics();
...才發現,你不能以這樣的方式實例化的FontMetrics。我嘗試使用getFontMetrics(字體)獲取一個FontMetrics對象,獲取默認擺動字體從回答這樣一個問題:
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。
不要使用getGraphics()!如果組件尚未被繪製,這將返回NULL。當您開始撥打電話時,用戶界面默認值可能尚未加載。 – MadProgrammer 2013-03-13 07:22:40
@MadProgrammer從來沒有在這種情況下,或永遠不會? – sleeparrow 2013-03-13 08:21:21
這是一個難以回答的問題,因爲它與上下文無關。 'getGraphics'爲您提供了用於渲染組件的最後一個圖形上下文的副本。如果組件從未渲染到屏幕,則這將爲空。依賴或普遍使用這種方法是一種不好的做法。所以雖然「從不」可能有點苛刻,但通常應該避免。 – MadProgrammer 2013-03-13 08:29:07