如何从java系统字体中获取ttf字体数据

如何从java系统字体中获取ttf字体数据

问题描述:

我在系统上安装了一些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://*.com/questions/5652344/how-can-i-使用-a-custom-font-in-java – John

+0

是不是他试图做相反的事情? (他有ttf,并试图把它放到系统中,而我需要一个系统字体并从中生成ttf)? –

+0

你只是想从文件中加载一个字体吗? – John

这是不可能的。您可以做的最好的是using reflection,但它只能与Oracle JRE一起使用并访问私有API,因此可能会破坏任何新的Oracle版本。

你也许可以写一个native lib枚举的字体和他们的文件。

+0

谢谢你回答Nate!我想是的,这是困扰。我目前的解决方案是在第一次运行时“预先缓存”字体名称映射 - >文件名,然后只更新该数据。它很慢,也许以后我可以回到这个,并且做一个本地库来做到这一点。但是,我的意思是。奇怪的是,它是这样的。 –

正如@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