2016-03-21 73 views
1

我的字體類:爲什麼我的字體無法繪製? (或加載) - Java的

// fall back font if init() fails 
public volatile static Font fallbackFont = new Font("serif", Font.PLAIN, 24); 

public synchronized static Font myFont() { 
    Font myFont; 
    try { 
     FileInputStream fis = new FileInputStream("res/fonts/gregorian.ttf"); 
     myFont = Font.createFont(Font.TRUETYPE_FONT, fis); 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     ge.registerFont(myFont); 
    } catch (Exception e) { 
     System.err.println("myFont font failed to load."); 
     return fallbackFont; 
    } 
    return myFont; 
} 

我然後調用fonts.init()g2d.setFont(myFont),然後g2d.drawString("test")我呈現類。

我沒有收到任何錯誤,也沒有收到我的異常消息。但是,屏幕上顯示的字體是我的後備襯線字體,而不是我的自定義字體。爲什麼會這樣?

編輯2:這實際上修復了它,在我的渲染類中出現了另一個愚蠢的錯誤。謝謝。

回答

2

Java的慣例是隻使用全部大寫字母作爲常量(即final或枚舉)。也就是說,你用同名的局部變量在你的init()方法中隱藏gloabl MYFONT

由於這個簡單的例子:

public int i = 0; 

public void update() { 
    int i = 10; // this does not in any way touch the above-declared "i" 
} 

public void updateProperly() { 
    i = 10; // this _does_ use the above-declared "i" 
} 

你做同樣的你的MYFONT變量。

一種更好的方式來構建你的代碼是不是這樣做:

public static Font myFont = getFont(); 

public static Font getFont() { 
    try { 
    FileInputStream fis = new FileInputStream("res/fonts/MYFONT.ttf"); 
    return Font.createFont(Font.TRUETYPE_FONT, fis); 
    } 
    // never catch "Exception", always catch the possible specific exceptions 
    catch (IOException e) { 
    System.err.println("Fonts failed to load."); 
    } 
    // fallback option 
    return new Font("serif", Font.PLAIN, 24); 
} 
+0

我也只是看到了錯誤:) – FallAndLearn

+0

,那麼請重新運行你的代碼,看看它在做什麼*現在*,這將是非常不同的,不只是編輯它說「我更新了它」,而是改寫整個事情,因爲你現在遇到了一個不同的問題=)(你也試圖捕獲'Exception',不要;只抓住實際被拋出的異常類型)。還要注意,你的新代碼做了一件非常奇怪的事情:它不是返回一個字體,而是「加載字體並綁定它的圖形上下文」或「返回字體」。這是什麼?一種方法應該做一件事,沒有副作用。 –

+0

這是一個測試方法,用多個不同的例子抓取代碼哈哈。對不起,它是馬虎,這是我第一次嘗試加載字體。 –

相關問題