#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
и для этого.