Mais uma API medonha: java.awt.Font

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).

Comments are closed.