2015-04-22 23 views
8

Mam kilka czcionek ttf zainstalowanych w systemie.Jak uzyskać dane czcionek ttf z czcionek systemowych w java

uzyskać tę listę za pomocą

GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames() 

To nie tylko TTF czcionki ale wszystkie czcionki chyba. Ostatecznie, jeśli mogę użyć:

Font.decode(fontName) 

mogę awt.Font instancji.

Z tego co wiem Czcionka nie jest podłączona do rzeczywistego PhysicalFont, więc w jaki sposób mogę pobrać plik czcionki ttf lub dane bajtowe z tego pliku ttf dla czcionki z tej listy lub z awt.Font? Próbuję pobrać fizyczną czcionkę lub coś podobnego. Te dane powinny być gdzieś w porządku?

Powodem muszę to w końcu korzystać z libgdx FreeTypeFontGenerator w celu wygenerowania BitmapFont

To musi działać na Windows, OSX i Linux.

+0

Jest to podobne do http://stackoverflow.com/questions/5652344/how-can-i- użyć-a-custom-font-in-java – John

+0

czy on nie próbował zrobić czegoś odwrotnego? (ma ttf i próbuje umieścić go w systemie, a ja muszę pobrać czcionkę systemową i wygenerować z niej ttf)? –

+0

Próbujesz załadować czcionkę z pliku, prawda? – John

Odpowiedz

3

Nie jest to możliwe. Najlepsze, co możesz zrobić, to using reflection, ale działa tylko z Oracle JRE i uzyskuje dostęp do prywatnego API, więc może zepsuć się z każdą nową wersją Oracle.

Prawdopodobnie można napisać native lib, aby wyliczyć czcionki i ich pliki.

+0

Dzięki za odpowiedź Nate! Chyba tak, to jest problem. Moje obecne rozwiązanie polega na "wstępnym buforowaniu" mapy nazwy czcionki -> nazwy pliku przy pierwszym uruchomieniu, a następnie zaktualizowaniu tych danych. Jest powolny i być może później będę mógł wrócić do tego i stworzyć natywną bibliotekę do tego. Ale mam na myśli. dziwne, że tak jest. –

3

Jak zaznaczył @NateS, wydaje się, że to, co chcę osiągnąć, nie jest dokładnie możliwe.

więc będę po prostu dzielić rozwiązanie użyłem w moim przypadku teraz:

Który to klasa: FontManager.java

Pozwala to na pre-cache istniejące pliki ttf w znanych lokalizacjach system oparty na swój system, a następnie utworzyć mapę dla typu fontName-> fontFile. następnie przechodzi do preferencji i jest ładowany przy następnym uruchomieniu.

Znane problemy są

  1. awt.Font posiada znany błąd, który nie jest w stanie odczytać niektóre nazwiska czcionki ttf na temat systemów OSX (głównie niektóre arabski i chiński Fonts)
  2. Nie przetestować na Linuksie prawdopodobnie się nie powiedzie.
  3. Pierwsze uruchomienie może być powolne, jeśli masz wiele czcionek.

Byłoby idealnie, aby napisać natywną lib, ale czas jest w istocie ...

+0

Jeśli ktoś nadal jest zainteresowany [FontManager.java] (https://github.com/UnderwaterApps/overlap2d/blob/master/overlap2d/src/com/uwsoft/editor/proxy/FontManager.java) – Metaphore