Código Java – Cambiar la Apariencia de la Interfaz Gráfica con LookAndFeel


Este es el Ejemplo #18 del Topic: Programación Gráfica en Java.

En este post vamos a jugar un poco porque aprenderemos a cambiar la apariencia de todos los componentes y contenedores de Java haciendo uso de las librerías del tipo LookAndFeel, todo esto con tan solo unas cuantas lineas de código que servirá para todo el proyecto sin importar de cuantos formularios o frames esté compuesto.

El Framework de java trae ya incluido algunos diseños que podemos usar directamente, esto no quiere decir que sean los únicos, los LookAndFeel podemos crearlo nosotros, personalizarlo o conseguirlo por medio de terceros. En este ejemplo muestro los que trae por defecto y agrego uno más a las librerías del proyecto, que lo encontré en los repositorios de Google Code y me por cierto se ve muy bien; es el seaglasslookandfeel.

Descargar: SeaGlassLookAndFeel

El código mostrará un frame con algunos componentes típicos añadidos, y en un ComboBox, los estilos que tomarán inmediatamente al seleccionarlo. Para empezar, muestro la función que creo es la esencia, el cual recibirá como parámetro el estilo que se dará a la GUI:

...
    private void setLookAndFeel(String laf)
    {

            if (laf==null) {
                    laf=UIManager.getSystemLookAndFeelClassName();
            }
            else
            {
                try {
                        UIManager.setLookAndFeel(laf);
                } catch (InstantiationException ex) {

                } catch (ClassNotFoundException ex) {

                } catch (UnsupportedLookAndFeelException ex) {

                } catch (IllegalAccessException ex) {

                }
            }
            SwingUtilities.updateComponentTreeUI(this);
    }
...

Código de Ejemplo:

/**
* seaglasslookandfeel-0.1.5.jar
*/
package beastieux.gui;

import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author beastieux
 */
public class Ejm18_LookAndFeel extends JFrame {

    JComboBox cmb1=new JComboBox();

    public Ejm18_LookAndFeel()
    {
        JPanel pnlEjemplo=new JPanel();

        JTextField txt1=new JTextField();
        
        JCheckBox chk1=new JCheckBox("Opcion 1");


        cmb1.setModel(new DefaultComboBoxModel
                     (new String[] { "Estilo MetalLookAndFeel",
                                     "Estilo MotifLookAndFeel",
                                     "Estilo GTKLookAndFeel",
                                     "Estilo NimbusLookAndFeel",
                                     "Estilo WindowsLookAndFeel",
                                     "Estilo SeaGlassLookAndFeel" }));

        cmb1.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmb1ItemStateChanged(evt);
            }
        });


        JButton btn1=new JButton("Button 1");


        pnlEjemplo.add(txt1);
        pnlEjemplo.add(cmb1);
        pnlEjemplo.add(chk1);
        pnlEjemplo.add(btn1);

        pnlEjemplo.setLayout(new GridLayout(5,1));

        this.add(pnlEjemplo);
        this.setSize(500, 150);

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
    }


    private void cmb1ItemStateChanged(java.awt.event.ItemEvent evt) {

        switch(cmb1.getSelectedIndex())
        {
            case 0:
                    setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
                    break;
            case 1:
                    setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 
                    break;
            case 2:
                    setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); 
                    break;
            case 3:
                    setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
                    break;
            case 4:
                    setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
                    break;
            case 5:
                    setLookAndFeel("com.seaglasslookandfeel.SeaGlassLookAndFeel"); 
                    break;
            default:
                    setLookAndFeel(null);
        }
    }

    private void setLookAndFeel(String laf)
    {

            if (laf==null) {
                    laf=UIManager.getSystemLookAndFeelClassName();
            }
            else
            {
                try {
                        UIManager.setLookAndFeel(laf);
                } catch (InstantiationException ex) {

                } catch (ClassNotFoundException ex) {

                } catch (UnsupportedLookAndFeelException ex) {

                } catch (IllegalAccessException ex) {

                }
            }
            SwingUtilities.updateComponentTreeUI(this);
    }

    public static void main(String args[]) {
        Ejm18_LookAndFeel obj = new Ejm18_LookAndFeel();
        obj.setVisible(true);
    }
}