Aumentar fonte com clique de JButton

1 resposta
diego_qmota

Boa tarde,

Gostaria de melhorar meus programas no SWING com relação a ACESSIBILIDADE e opções que tragam mais conforte e facilidade de uso aos usuários.
Gostaria de, ao clique de um botão, aumentar a fonte de todos os componentes de todas as janelas do meu aplicativo. Fiz um JDialog para configurar o tamanho e a idéia é que as alterações se apliquem a todas as janelas.
Como posso fazer isso?

Tentei configurar a fonte de todos os componentes, atribuindo como objeto Font um objeto Font static. No entanto, ao alterar a instância desses objetos static para um novo tamanho de fonte, a alteração não se reflete nas janelas:

//importações e outros dados omitidos
 public class Sistema {

   //Estas são as fontes que estou usando em todos os componentes. Ex: JLabel.setFont(Sistema.FONTE_NORMAL);
    public static Font FONTE_NORMAL = new Font ( "Verdana", Font.PLAIN, 12 );
    public static Font FONTE_DESTAQUE = new Font ( "Verdana", Font.BOLD, 12 );

/**
* Método que altera o tamanho das fontes usadas em todo o sistema
* @param novoTamanho O novo tamanho que as fontes devem assumir
*/
public static void resizeFonts( float novoTamanho )
    {
        FONTE_NORMAL = FONTE_NORMAL.deriveFont(novoTamanho);
        FONTE_DESTAQUE = FONTE_DESTAQUE.deriveFont(novoTamanho);
    }

} //fim da classe

Como posso implementar minha idéia?

OBS : Eu sei que posso criar métodos public em todos os formulários JFrame que são acionados para substituir a fonte de todos os componentes. Gostaria de evitar esse meio, porquê tenho que ficar pegando todos os componentes de cada JPanel e os que estiverem dentro destes… e tenho que discernir qual o tipo deste e que fonte será usada para representá-lo (fonte comd estaque ou sem)…e por aí vaí. Gostaria de uma forma mais simples e ágil, que surtisse efeito em todas as janelas, mesmo que manipulasse o L&F.
No entanto, se não tiver outro jeito, eu faço conforme a observação acima…

1 Resposta

diego_qmota

Pessoal, consegui fazer após extensas pesquisas na net.
No entanto, há algumas restrições:

[list]Não podem haver componentes com fontes definidas pelo usuário - todos devem estar configurados com a fonte padrão, a FontUIResource;[/list]
[list]Não funciona no Nimbus Look and Feel - parece que há um bug nesse L&F quando se configura a fonte através de propriedades (não sei afirmar isso com certeza, foi o que vi de relance em um site). O curioso é que só a fonte do título de um JPanel (com TitledBorder) é que alterou. As outras…;
[/list]

import java.awt.Font;
import java.awt.Window;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

/**
 * Permite ajustar a fonte de todo o aplicativo
 *
 */
public class FontAdjustement {

    /**
     * Permite redimensionar a fonte padrão em todo o aplicativo
     * 
     *
     * @param adjust Valor de ajuste a ser feito na fonte. Ex: +1 para aumentar 1 ponto e -1 para dimuir
     * @param janelasAlterar janelas onde as alterações devem repercutir imediatamente
     */
    public static void adjustFontSize( int adjust, Window [] janelasAlterar )
    {
        Object[] objs = UIManager.getLookAndFeel().getDefaults().keySet().toArray();
        for( int i = 0; i < objs.length; i++ )
        {
            //Busca propriedades do Look and Feel que contenham a palavra ".font"
            if( objs[i].toString().toUpperCase().indexOf( ".FONT" ) != -1 )
            {
                Font font = UIManager.getFont( objs[i] );
                font = font.deriveFont( (float)(font.getSize() + adjust ));
                UIManager.put( objs[i], new FontUIResource(font) );
            }
        }
        
        //Repercute alterações nas janelas já abertas e as redimensiona se necessário
        for (Window janela : janelasAlterar) {
            SwingUtilities.updateComponentTreeUI(janela);
            janela.pack();   
        }

    }


}   //fim da classe

Quem tiver alguma sugestão melhor, por favor …

Criado 16 de março de 2010
Ultima resposta 17 de mar. de 2010
Respostas 1
Participantes 1