Хотя я не могу рассказать вам, как обойти саму проблему, вы можете использовать этот метод, чтобы точно решить, когда ее инициировать:
new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_GRAY).createGraphics().getFontMetrics();
Это полезно, потому что вы можете поместить его в любом месте - так, например, вы можете сделать это, пока вы отображаете экран загрузки или что-то еще. Если вы используете Graphics
объект во время paint()
, то вы можете только инициализировать во время рендеринга.
EDIT:
Фактически это может быть уменьшено до:
FontUtilities.getFont2D(new Font("Dialog", 0, 12));
(Медленная часть - это вызов getFont2D
, а не конструктор Font
.)
РЕДАКТИРОВАТЬ 2:
И, наконец, это можно уменьшить до:
sun.font.FontManagerFactory.getInstance();
Проблема в том, что этому одноэлементному классу требуется много времени для запуска, поскольку он перечисляет всех системных шрифтов.
РЕДАКТИРОВАТЬ 3:
Нет хорошего способа обойти эту проблему, если вы хотите использовать стандартную графическую систему.