2013-03-13 36 views
3

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

+0

不要使用getGraphics()!如果組件尚未被繪製,這將返回NULL。當您開始撥打電話時,用戶界面默認值可能尚未加載。 – MadProgrammer 2013-03-13 07:22:40

+0

@MadProgrammer從來沒有在這種情況下,或永遠不會? – sleeparrow 2013-03-13 08:21:21

+0

這是一個難以回答的問題,因爲它與上下文無關。 'getGraphics'爲您提供了用於渲染組件的最後一個圖形上下文的副本。如果組件從未渲染到屏幕,則這將爲空。依賴或普遍使用這種方法是一種不好的做法。所以雖然「從不」可能有點苛刻,但通常應該避免。 – MadProgrammer 2013-03-13 08:29:07

回答

0

要確定問題出在哪裏,您應該嘗試分離出引發異常的物理線路中的每條邏輯線路。例如,

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

我會懷疑,這個問題是不存在與用戶界面默認的「TabbedPane.font」鍵註冊的字體。爲了克服這一點,您應該能夠通過Component#getFont方法直接從組件獲取字體。這真的是你想要的字體。