回答
它可能不是那麼簡單。某些字體由許多物理字體組成,對不同的字形使用不同的物理字體。
例如,我的Windows系統上的Serif字體使用12種物理字體:
- **的TrueType字體:家庭= Times New Roman字體名稱=宋體風格= 0文件名= C:\ WINDOWS \字體\ TIMES.TTF
- **的TrueType字體:家庭=宋體名稱=宋體風格= 0文件名= C:\ WINDOWS \ Fonts \中WINGDING.TTF
- **的TrueType字體:家庭=符號名稱=符號樣式= 0 fileName = C:\ Windows \ Fonts \ SYMBOL.TTF
- ** TrueType字體:Family = Lucida Sans Name = Lucida Sans Regular style = 0 file Name = C:\ Java \ jdk \ jdk1.6.0_37 \ jre \ lib \ fonts \ LucidaSansRegular.ttf
- ** TrueType字體:Family = MingLiU Name = MingLiU style = 0 fileName = C:\ Windows \ Fonts \ MINGLIU .TTC
- **的TrueType字體:家庭=龍力三世名稱=龍力三世經常風格= 0文件名= C:\的Java \ jdk的\ jdk1.6.0_37 \ JRE \ lib文件\ Fonts \中LucidaSansRegular.ttf
- ** TrueType字體:Family = SimSun Name = SimSun style = 0 fileName = C:\ Windows \ Fonts \ SIMSUN.TTC
- ** TrueType字體:Family = Lucida Sans Name = Lucida Sans Regular style = 0 fileName = C:\ Java \ jdk \ jdk1.6.0_37 \ jre \ lib \ fonts \ LucidaSansRegular.ttf
- ** TrueType字體:Family = MS Mincho Name = MS Mincho style = 0 fileName = C:\ Windows \ Fonts \ MSMINCHO.TTC
- ** TrueType字體:Family = Batang Name = Batang style = 0 fileName = C:\ Windows \ Fonts \ batang.TTC
- ** TrueType字體: Family = MingLiU-ExtB Name = MingLiU-ExtB style = 0 fileName = C:\ Windows \ Fonts \ MINGLIUB.TTC
- ** TrueType字體:Family = SimSun-ExtB Name = SimSun-ExtB style = 0 fileName = C: \ Windows \ Fonts \ SIMSUNB.TTF
以下代碼可以將字體分解爲其物理組件。它採用了反射黑客訪問sun.awt.Font2D
對象,所以需要您自擔風險使用(與Oracle的Java 6u37工作):
import java.awt.Font;
import java.lang.reflect.Method;
import java.util.Locale;
import sun.font.CompositeFont;
import sun.font.Font2D;
import sun.font.PhysicalFont;
public class FontTester
{
public static void main(String... args)
throws Exception
{
Font font = new Font("Serif", Font.PLAIN, 12);
describeFont(font);
}
private static void describeFont(Font font)
throws Exception
{
Method method = font.getClass().getDeclaredMethod("getFont2D");
method.setAccessible(true);
Font2D f = (Font2D)method.invoke(font);
describeFont2D(f);
}
private static void describeFont2D(Font2D font)
{
if (font instanceof CompositeFont)
{
System.out.println("Font '" + font.getFontName(Locale.getDefault()) + "' is composed of:");
CompositeFont cf = (CompositeFont)font;
for (int i = 0; i < cf.getNumSlots(); i++)
{
PhysicalFont pf = cf.getSlotFont(i);
describeFont2D(pf);
}
}
else
System.out.println("-> " + font);
}
}
此代碼將得到系統的字體,如果他們是可用的,並且會得到默認的家庭,如果由於某種原因,他們無法使用:
static String[] AS_System_Fonts = null;
public static String[] getFontFamilies(){
if(AS_System_Fonts != null) return AS_System_Fonts;
java.awt.GraphicsEnvironment gEnv = java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
AS_System_Fonts = gEnv.getAvailableFontFamilyNames();
if(AS_System_Fonts == null){ // should not happen
AS_System_Fonts = new String[8];
AS_System_Fonts[0] = "Serif";
AS_System_Fonts[1] = "Sans-Serif";
AS_System_Fonts[2] = "Monospaced";
AS_System_Fonts[3] = "Dialog";
AS_System_Fonts[4] = "Dialog Input";
AS_System_Fonts[5] = "Lucida Bright";
AS_System_Fonts[6] = "Lucida Sans";
AS_System_Fonts[7] = "Lucida Sans Typewriter";
}
return AS_System_Fonts;
}
以外的非標準變量命名(AS_System_Fonts會好得多,命名爲systemFonts),很好的答案! – GreyBeardedGeek
對於變量名稱感到遺憾,它是具有專門命名約定的實用工具包中出現的工件,請隨時重命名爲 –
prunge的回答是近乎完美的,但它實際上並沒有露出天然(物理)字體的名稱。通過再次利用Java反射,describeFont2D方法發生如下細微變化:
不要忘記導入java.lang.reflect.Field;
private static void describeFont2D(Font2D font) throws Exception{
if(font instanceof CompositeFont){
System.out.println("Font '"+font.getFontName(Locale.getDefault())+"' is composed of:");
CompositeFont cf = (CompositeFont)font;
for(int i = 0; i<cf.getNumSlots(); i++){
PhysicalFont pf = cf.getSlotFont(i);
describeFont2D(pf);
}
}else if(font instanceof CFont){
Field field = CFont.class.getDeclaredField("nativeFontName");
field.setAccessible(true);
String nativeFontName = (String)field.get(font);
System.out.println("-> "+nativeFontName);
}else
System.out.println("-> "+font);
}
[@ dan-borque](https://stackoverflow.com/users/77479/dan-bourque ),我們還需要導入'sun.font.CFont'。也就是說,'sun.font.CFont'僅適用於Mac OS X,這限制了此修改方法在該平臺上的使用。 –
- 1. 從Java字體文件中檢索字體名稱
- 2. 如何從Android的TTF文件中檢索字體名稱
- 3. 檢索RichTextBox中選定文本的字體名稱
- 4. 如何從woocommerce中的變體ID中檢索變體名稱?
- 5. 檢索計算機名稱
- 6. 如何檢索c#上的字體名稱?
- 7. 如何檢索$ _POST字段名稱
- 8. 如何使用Inno pascal腳本檢索計算機名稱?
- 9. 如何檢索在Acrobat中選擇的打印機的名稱?
- 10. 如何檢索Java腳本對象名稱數組
- 11. 檢索手機的設備名稱
- 12. 如何在CRM 2016中檢索實體名稱
- 13. 如何在VB.Net中檢索.pst名稱
- 14. 如何使用ASTParser從java文件中檢索SuperClass名稱?
- 15. 如何在java中通過名稱檢索對象
- 16. 檢索實體名稱時崩潰?
- 17. powershell:如何檢索dns格式的計算機名稱
- 18. Android - 檢索默認系統字體字符串名稱
- 19. 如何檢索鏈接的名稱?
- 20. 如何檢索cookie的urlencoded名稱
- 21. 如何檢索IHTMLElement的aspx父名稱
- 22. 如何從保存的文件中檢索隨機數字? (Java)
- 23. 從Java方法檢索變量名稱
- 24. 在MySQL中檢索名稱
- 25. 如何在Java中獲取SWT字體家族名稱?
- 26. 在軌道發電機中檢索發電機名稱
- 27. 如何在Java中檢索文件名的禁用字符?
- 28. 如何重命名從手機圖庫中檢索圖像,並用新名稱
- 29. 如何使用jquery檢索文本框的標題和名稱?
- 30. 如何從MySQL檢索所有名稱?
你是什麼意思的「本地字體」? –
因爲有Java應用程序可以顯示系統上安裝的本機字體(例如,IntelliJ IDEA顯示我的Linux機器上的'DejaVu Sans Mono'等字體列表),所以這裏已經有了。這只是我沒有確切的步驟來實現這個:) –
你試過font.getFontName()嗎? – GreyBeardedGeek