Как применить .ttc к шрифту в Java awt

#java #fonts #awt #inputstream #embedded-resource

Вопрос:

Я пытался прочитать файл .ttc с помощью java.io.InputStream в IntelliJ IDEA, но это не удалось.

Вот мой код:

 InputStream inputStream = getClass().getResourceAsStream("Dependencies\msjh.ttc"); Font font; try {  if (inputStream == null)  throw new IOException();  font = Font.createFont(Font.TRUETYPE_FONT, inputStream).deriveFont(Font.PLAIN); } catch (IOException | FontFormatException exception) {  font = new Font("Microsoft JhengHei UI", Font.PLAIN, 16); }  

Как бы я ни старался, условие if (inputStream == null) всегда верно, и исключение IOException будет выдано.

Но аналогичный способ настройки значка окна работает:

 Frame frame = new Frame("Window"); frame.setIconImage(Toolkit.getDefaultToolkit().getImage("Dependencies\icon.png"));  

Вот пути из моих файлов :

 IdeaProjectsProjectDependenciesmsjh.ttc (font file) IdeaProjectsProjectDependenciesicon.png (image file) IdeaProjectsProjectsrcbin_genMain.java (source code)  

и есть опция виртуальной машины: -Dfile.encoding=MS950

Этот файл .ttc был скопирован из C:WindowsFontsMicrosoft JhengHei UI . Я пытаюсь это сделать, потому font = new Font("Microsoft JhengHei UI", Font.PLAIN, 16); что кажется, что это не работает (шрифт, отображаемый в окне, по-прежнему является шрифтом по умолчанию).

Ответ №1:

Я рекомендую использовать getResource , а не getResourceAsStream . Они следуют немного другим правилам, и я хорошо понимаю правила первого.

Если шрифт находится в банке, созданной IDE, он будет расположен по адресу /Dependencies/msjh.ttc .

Обратите внимание на две отдельные косые черты ( / ) в отличие от обратной косой черты, подобной файлу ( \ ). Эта обратная косая черта предназначена только для файлов и только в Windows. Что getResource нужно, так это путь к ресурсу либо непосредственно из корня проекта или jar, либо относительно вызывающего его класса. / Префикс указывает JRE искать ресурс в корне пути к классу, а не относительно вызывающего класса.

Также не используйте getImage("Dependencies\icon.png") . Это будет предполагать, что строка представляет путь к файлу, который не будет работать при развертывании проекта. Используйте getResource и для этого.