2015-04-22 690 views
8

我在系統上安裝了一些ttf字體。如何從java系統字體中獲取ttf字體數據

我得到使用

GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames() 

該列表這不僅ttf字體,但我想所有字體。 最終如果我使用:

Font.decode(fontName) 

我可以得到awt.Font實例。

據我所知字體沒有連接到實際的PhysicalFont,所以 我該如何檢索ttf字體文件,或從該ttf文件的字節數據從該列表中的字體或從awt.Font?我試圖檢索一個物理字體數據或類似的東西。這些數據應該是正確的?

的原因,我需要它是爲了產生BitmapFont

這有可能在Windows,OSX和Linux工作與libGDX FreeTypeFontGenerator最終使用。

+0

這類似於http://stackoverflow.com/questions/5652344/how-can-i-使用-a-custom-font-in-java – John

+0

是不是他試圖做相反的事情? (他有ttf,並試圖把它放到系統中,而我需要一個系統字體並從中生成ttf)? –

+0

你只是想從文件中加載一個字體嗎? – John

回答

3

這是不可能的。您可以做的最好的是using reflection,但它只能與Oracle JRE一起使用並訪問私有API,因此可能會破壞任何新的Oracle版本。

你也許可以寫一個native lib枚舉的字體和他們的文件。

+0

謝謝你回答Nate!我想是的,這是困擾。我目前的解決方案是在第一次運行時「預先緩存」字體名稱映射 - >文件名,然後只更新該數據。它很慢,也許以後我可以回到這個,並且做一個本地庫來做到這一點。但是,我的意思是。奇怪的是,它是這樣的。 –

3

正如@NateS指出的那樣,我想要達到的目標不是完全可能的。

所以我只是分享我在我的情況下使用,現在的解決方案:

這是本類: FontManager.java

這使得現有的ttf文件,在已知的系統中的位置預緩存根據您的系統,然後爲fontName-> fontFile類型的連接創建一個Map。然後進入首選項,並在下次運行時加載。

已知問題

  1. awt.Font有一個已知的bug,是不是能夠讀取OSX系統的一些TTF字庫系列名稱(主要是一些阿拉伯和中國的字體)
  2. 沒有在Linux上測試,可能會失敗。
  3. 如果您有許多字體,則第一次運行可能會很慢。

這將是理想的寫一個本地庫,但時間的本質......

+0

如果還有人對[FontManager.java]感興趣(https://github.com/UnderwaterApps/overlap2d/blob/master/overlap2d/src/com/uwsoft/editor/proxy/FontManager.java) – Metaphore