Fonte Comum no Linux e Windows

O problema é que você teria que instalar as fontes no sistema operacional, o que varia para cada um deles e ainda pode exigir privilégios que o usuário não possui. Isso se forem TrueType (não olhei), se não, nem servem.

Cara fiz do jeito que vc me disse, baixei os fontes da API jasperreport-0.6.4 e fiz aquela alteração que vc me falou ! No entanto, estou com um problema : Como setar o tamanho da fonte ?? Estava tentando algo do tipo :

font = Font.createFont(Font.TRUETYPE_FONT, this.getClass().getResourceAsStream("/skins/LucidaTypewriterRegular.ttf"));
font1 = new Font(null, Font.TRUETYPE_FONT, 10);
font1 = font.deriveFont(10);

Esse font não deveria possuir um setSize() ou algo do tipo não ??

valeu !!

Você deve usar o deriveFont mesmo, inclusive para aplicar estilos como negrito e itálico. Vale a pena utilizar um cache para isso, por sinal.

Blz então. Agora, outra dúvida : No ireport eu setei dois campos com fontes diferentes, um com Courier e outra com Utopia. Quando eu rodo o relatorio a partir da minha aplicação, com o jaspereport-0.6.4 que eu alterei, não seria para o jasperreport alterar as fontes que eu setei no iReport e sobrescrever para a fonte que eu estou apontando agora ?? No entanto, ele não faz isso !! Ele ainda mostra os campos com Courier e Utopia !!! Eh como se a alteração que eu fiz não tivesse “forçando” a apontar para a minha nova fonte !!

 public Font getFont()
    {
        if (font == null)
            try
            {

                font = Font.createFont(Font.TRUETYPE_FONT, this.getClass().getResourceAsStream("/skins/LucidaTypewriterRegular.ttf"));
                font1 = new Font(font.getName(), Font.TRUETYPE_FONT, 10);
                font1 = font.deriveFont(10);

            }
            catch (FontFormatException e)
            {

                throw new RuntimeException("Erro no formato da fonte", e);

            }
            catch (IOException e)
            {
                throw new RuntimeException("Erro ao carregar fonte", e);

            }
        return font1;
    }

O addRun(…) ainda está chamando esse seu método? Você já tentou depurá-lo?

Sim. Tudo está compilando e rodando sem erro !!! No entanto, minha fonte não está sendo setada !!

 public void addRun(Run run)
    {
        run.attributes.put(TextAttribute.FONT, getFont());
        runs.add(run);
        attributedString = null;
    }

A última vez que testei isso foi com o 0.6.3, portanto, como você falou do 0.6.4, esse código pode não ter mais nada a ver :frowning:

Tente usar o 0.6.3 e diga o que acontece.

Não é possível baixar os fontes da versão 0.6.3 !! No site só é possível pegar da 0.6.4 pra cima !! :frowning:

Pegue direto do CVS.

Baixei lá do CVS a versão 0.6.3 e fiz as mesmas alterações, resultado : Deu certo !!! :smiley:
heheh . O chato é que, por exemplo, se eu for atualizar a versão do jasperreport não vou conseguir setar a minha fonte, fazendo a mesma alteração na API !!! :frowning: . No entanto, por enquanto vou deixar assim mesmo !!!

mister_m, num post passada vc citou a possiblidade de criar uma lista de fontes. Bem , na minha aplicação seria interessante ter duas fontes !! Como poderei adcionar mais uma fonte e ainda poder setá-la ??

valeu !!

A idéia seria você manter um Map relacionando o nome da fonte que é usado no relatório com a sua instância específica. Um dos atributos contidos em r.attributes é o nome da fonte usado no relatório, que você pode usar como chave para obter a instância da sua própria fonte.

Opa !! No meu caso não precisarei de duas fontes não !!! Mas sim de duas instâncias da mesma fonte, em tamanho diferentes !!! Preciso que essa minha fonte especifica tenha tamanho 18 no título e em todos os outros campos tenha tamanho 10 !!! Ou seja, preciso da mesma fonte em tamanhos diferentes !!!

A sua solução seria algo do tipo :

 run.attributes.put("NomeDaFonte", getFont());

E lá no .jrxml eu colocaria assim :

<font fontName="NomeDaFonte"  .......

valeu !!

Não é necessário fazer isso. No r.attributes estão contidas informações como tamanho da fonte e estilo. Basta usar o deriveFont(…) na instância da fonte e eventualmente fazer cache.

Ao criar a fonte :

font = Font.createFont(Font.TRUETYPE_FONT, this.getClass().getResourceAsStream("BitstreamVeraSans.ttf"));
font = font.deriveFont(Font.TRUETYPE_FONT, 10);

E ao setá-la como padrão :

run.attributes.put(TextAttribute.FONT, font);

Todos os campos no meu relatorio vão ter tamanho 10 !!! Note que eu naõ tenho como mudar o tamanho da font, pois mudará para todos os campos !!!

Não, você não captou bem a mensagem :slight_smile:

Você pode fazer algo como (não testado):

Font f = getFont();
Number size = r.attributes.get(TextAttribute.SIZE);

if (size != null && size.intValue() != 10) {
   f = f.deriveFont(size.intValue());
}

r.attributes.put(TextAttribute.FONT, f)

[quote=mister__m]

[code]
Font f = getFont();
Number size = r.attributes.get(TextAttribute.SIZE);

if (size != null && size.intValue() != 10) {
f = f.deriveFont(size.intValue());
}

r.attributes.put(TextAttribute.FONT, f)
[/code][/quote]

Cara sinceramente não entendo uma coisa : Ao fazer “r.attributes.put(TextAttribute.FONT, f)” no Map será adcionado f não eh ?? E sse f possui apenas um tamanho não eh ?? Como então vou conseguir tamanhos diferentes dessa instancia f no meu relatorio ?? Do jeito que vc fez ai, todos os campos do meu relatorio ficaram no mesmo tamanho !!!

[quote=Javax][quote=mister__m]

[code]
Font f = getFont();
Number size = r.attributes.get(TextAttribute.SIZE);

if (size != null && size.intValue() != 10) {
f = f.deriveFont(size.intValue());
}

r.attributes.put(TextAttribute.FONT, f)
[/code][/quote]

Cara sinceramente não entendo uma coisa : Ao fazer “r.attributes.put(TextAttribute.FONT, f)” no Map será adcionado f não eh ?? E sse f possui apenas um tamanho não eh ?? Como então vou conseguir tamanhos diferentes dessa instancia f no meu relatorio ?? Do jeito que vc fez ai, todos os campos do meu relatorio ficaram no mesmo tamanho !!![/quote]

Você está meio perdido :slight_smile: Você testou meu código? Eu estou modificando a instância de f no exemplo que coloquei. Não tem razão pra não funcionar.

Agora eu entendi !!! :lol: O método addRun é executado para cada campo do meu .jrxml. E cada instãncia de run possui um Map, que contém o tamanho e estilo da fonte associada a um campo !!
Ao fazer :

Number size = (Number)run.attributes.get(TextAttribute.SIZE);

Vc estaria recuperando o tamanho da fonte corrente associada a um campo específico !!

Testei seu código ele executa sem erro, no entanto ele não está conservando o tamanho da fonte. Por exemplo, no meu relatorio existe um campo que tem tamanho 18. Ele deveria conservar o tamanho 18 e aplicar a minha fonte, no entanto ele está aplicando minha fonte com o tamanho 10. Ou seja, o campo não aparce no tamanho 18 , mas sim no tamanho 10 !! Segue abaixo o trecho de código.

public void addRun(Run run)
    {
        Font f = getFont();
        Number size = (Number)run.attributes.get(TextAttribute.SIZE);
        if (size != null && size.intValue() != 10) {
           f = f.deriveFont(size.intValue());
        } 
        run.attributes.put(TextAttribute.FONT, f);
        runs.add(run);
        attributedString = null;
    }

Descobri o erro !!! :smiley: Na linha que tinha :

 f = f.deriveFont(size.intValue());

Eu troquei por :

 f = f.deriveFont(size.floatValue());

Do jeito que estava, ele tava setando era o estilo !!

valeu cara pela ajuda !!!

[quote=Javax]Descobri o erro !!! :smiley: Na linha que tinha :

 f = f.deriveFont(size.intValue());

Eu troquei por :

 f = f.deriveFont(size.floatValue());

Do jeito que estava, ele tava setando era o estilo !! [/quote]

Verdade, o método é sobrecarregado. Por sinal. perigosíssimo isso de ter métodos que recebem tipos primitivos com semânticas totalmente diferentes.