2015-04-22 2 views
8

У меня есть некоторые шрифты ttf, установленные в системе.Как получить данные шрифта ttf из системных шрифтов в java

Я получаю этот список с помощью

GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames() 

Это не только TTF шрифты, но все шрифты я догадываюсь. В конце концов, если я использую:

Font.decode(fontName) 

я могу получить awt.Font экземпляр.

Насколько я знаю, шрифт не связан с фактическим физическим шрифтом, поэтому как я могу получить либо файл шрифта ttf, либо байтовые данные из этого файла ttf для шрифта из этого списка или из awt.Font? Я пытаюсь получить данные физического шрифта или что-то подобное. Эти данные должны быть где-то в порядке?

Причина мне нужно это, в конечном счете использовать с libGDX FreeTypeFontGenerator для того, чтобы генерировать BitmapFont

Это должно работать на окна, OSX и Linux.

+0

Это похоже на http://stackoverflow.com/questions/5652344/how-can-i- use-a-custom-font-in-java – John

+0

не пытался ли он сделать наоборот? (он имеет ttf и пытается поместить его в систему, в то время как мне нужно взять системный шрифт и сгенерировать ttf из него)? –

+0

Вы просто пытаетесь загрузить шрифт из файла? – John

ответ

3

Невозможно. Лучшее, что вы можете сделать, это using reflection, но оно будет работать только с Oracle JRE и получить доступ к частному API, поэтому может сломаться с любым новым выпуском Oracle.

Возможно, вы можете написать native lib, чтобы перечислять шрифты и их файлы.

+0

Спасибо, что ответили Нейту! Думаю, да, это что-то смущает. Мое настоящее решение - «предварительно кэшировать» карту имени шрифта -> имя файла при первом запуске, а затем просто обновлять эти данные. Он медленный, и, возможно, позже я смогу вернуться к этому и сделать собственный lib для этого. Но я имею в виду. странно, что это так. –

3

Как отметил @NateS, похоже, что я хочу достичь, это не совсем возможно.

Так что я просто поделюсь решением я использовал в моем случае на данный момент:

Что этот класс: FontManager.java

Это позволяет предварительно кэш существующего TTF файлов в известных местах системы, основанный на вашем и затем создайте тип подключения для шрифтаName-> fontFile. это затем переходит к настройкам и загружается при следующем запуске.

Известные проблемы

  1. awt.Font имеется известная ошибка, которая не в состоянии прочитать некоторые семейные TTF шрифт имена в системах OSX (в основном некоторые арабские и китайские шрифты)
  2. Не проверить на Linux , вероятно, не удастся.
  3. Первый запуск может быть медленным, если у вас много шрифтов.

Было бы идеально, чтобы написать родной LIB, но время от сущности ...

+0

В случае, если кто-либо еще интересуется [FontManager.java] (https://github.com/UnderwaterApps/overlap2d/blob/master/overlap2d/src/com/uwsoft/editor/proxy/FontManager.java) – Metaphore

Смежные вопросы