Pois é, mais uma importante lição para o arquivo: java.awt.Font
é mais uma API medonha do JDK. O problema é como funciona o carregamento de fontes.
A API provê um método chamado getFont(String name)
que carrega uma fonte dado seu nome. Caso não encontre uma fonte com este nome, retorna null
. A maior parte do código de terceiros, i.e., fora do JDK, que carrega fontes pelo nome, usa este método e geralmente utiliza uma fonte default caso o método retorne null
. Como usar outra fonte pode ter impactos altamente negativos para diversos usos, como impressão de formulários específicos, geralmente não é este comportamento que o desenvolvedor deseja na aplicação.
Existe uma maneira padrão de se carregar uma fonte em Java: o método createFont(int fontFormat, java.io.InputStream fontStream)
, que funciona com fontes TrueType, criadas com fontFormat
Font.TRUETYPE_FONT
. Ou seja, se você anexar a sua aplicação os arquivos .TTF das fontes que você usou, é possível carregá-los dinamicamente. Mas, nem tudo é bonito assim :-/
Embora a API, ao carregar um arquivo de fonte, seja capaz até mesmo de identificar o nome da fonte, não existe na API uma forma de associar um nome a uma fonte. Em outras palavras, você consegue carregar uma fonte por nome, mas não é possível afetar ou customizar o retorno de getFont(String)
. Levando em conta que, como eu disse antes, a maior parte do código do mundo “acredita” em getFont(String)
, a menos que a fonte esteja instalada no S.O. – e exatamente a mesma fonte, o que raramente acontece :-/ -, tudo dá errado.
Qual a solução para o problema? Se você está lidando com open-source, existe a possibilidade de reescrever o código para usar seu próprio esquema de carregamento de fontes por nome, que permita associar o nome a certa instância de Font
. Você pode também escrever um aspecto que intercepte a chamada a getFont(String)
se você não quiser manter um branch ou se o software for fechado (e a licença permitir modificação binária).