viernes, 28 de junio de 2013

Cambiar Look and Feel (Temas) en Aplicaciones JAVA (Estático y Dinámico)



Muchas veces hemos querido cambiar el aspecto de nuestras aplicaciones Java (En caso de crear alguna Interfaz Gráfica) ya que el tema METAL que usa por defecto no es muy vistoso que digamos, a esto se le conoce como Look And Feel.

En esta ocasión les mostraré como utilizar algunos de los temas que vienen por defecto junto con nuestro JDK, eso quiere decir que no necesitamos instalar ninguna librería ni nada por el estilo.

Les mostraré como realizar esto de manera Estática y Dinámica, ¿Qué quiere decir esto? La forma estática quiere decir que configuraremos un tema diferente al que java usa por defecto, este no se podrá cambiar durante la ejecución de la aplicación, así que si este es nuestro fin debemos realizarlo de este manera.

Por el contrario, si lo que deseamos es que nuestra interfaz pueda cambiar de tema las veces que queramos durante su ejecución; debemos optar por la forma Dinámica. Sin más rodeos vamos al grano.

Look and Feel Estático

No entraré en detalles sobre como crear una ventana o como agregar los componentes gráficos necesarios, pero funciona si utilizamos un IDE como Jcreator, Netbeans, Eclipse, etc.

Este es un ejemplo del tema denominado METAL que java utiliza por defecto


Para cambiarlo necesitamos colocar el siguiente código en el constructor de nuestra clase que representará la interfaz gráfica, por ejemplo al utilizar NetBeans, Agregamos un JFrame Form, se nos pedirá el nombre del mismo y listo, luego vamos al constructor de la clase que tiene el mismo nombre que le pusimos al JFrame y justo antes de la llamada el metodo initComponents() colocamos lo siguiente

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");          

Como argumento debemos pasarle el string que corresponde a los temas que vienen por defecto en el JDK, más adelante hablaremos sobre esto. La parte de UIManager nos la mostrará como error de sintaxis, solo necesitamos importar de la librería estándar de java el modulo UIManager (En el inicio de la clase y después de la sentencia package) y encerrar el código anterior dentro de una sentencia try-catch


Importando el modulo UIManager para poder utilizar nuestro tema
import javax.swing.UIManager;      


Sentencia para cambiar nuestro Look and Feel 
try{
  UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}catch(Exception e){
  e.printStackTrace();
} 


Ahora corremos nuestra aplicación y veremos el resultado


Vemos como el aspecto de los componentes ha cambiado, similar a los componentes de los sistemas Microsoft Windows, si recuerdan el argumento que pasamos a la función setLookAndFeel()  era el siguiente: "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
El cual corresponde al tema de Windows, a continuación  les dejo el String y la imagen de como se ven los temas que se encuentran instalados en mi sistema


javax.swing.plaf.metal.MetalLookAndFeel




javax.swing.plaf.nimbus.NimbusLookAndFeel




com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel


Así que no nos queda más que colocar el que más nos guste y listo.



Look And Feel Dinámico

Para hacer que nuestra aplicación cambie entre todos los temas disponibles durante su ejecución definiremos una interfaz como la siguiente, lo más importante es un jComboBox y un jButton


el jComboBox nos servirá para mostrar todos los look and feel disponibles, a manera de solo seleccionarlo y al dar click al boton Cambiar Look que se aplique el que hayamos seleccionado

Debemos importar los siguientes modulos:

import javax.swing.UIManager;
import javax.swing.SwingUtilities;

El primero ya hemos visto que es necesario para seleccionar un look and feel especifico, y el segundo modulo nos servirá para actualizar los componentes una vez cambiado nuestro tema


Creamos una variable del tipo array  del tipo LookAndFeelInfo  el cual nos servirá para obtener todos los temas instalados

UIManager.LookAndFeelInfo[] lafinfo = UIManager.getInstalledLookAndFeels();


En el constructor de nuestra clase (antes del método InitComponents()), colocaremos un ciclo for para recorrer el array que declaramos anteriormente y   así almacenar en el jComboBox por medio de la funcion addItem; los nombres de los temas que contiene. Con System.out.println() mostraremos en la consola de NetBeans los temas instalados para poderlo copiar y pegar si deseamos cambiar el tema de manera estática (ver la primera parte al principio de este tutorial)

for (int i=0;i<lafinfo.length;i++){
    jComboBox1.addItem(lafinfo[i].getClassName());
    System.out.println(lafinfo[i].getClassName());
}



Ahora para finalizar, en el evento del Boton que agregamos a la interfaz (Doble click al boton en modo diseño si se utiliza NetBeans) colocamos las siguientes sentencias:

try{
    String look = jComboBox1.getSelectedItem().toString();
    UIManager.setLookAndFeel(look);
    SwingUtilities.updateComponentTreeUI(this);
    }catch(Exception e){
        e.printStackTrace();
    }

En la variable del tipo String llamada look obtendremos el nombre del tema que esté seleccionado en el jComboBox1, a continuación fijaremos el tema usando la función setLookAndFeel y pasando como argumento la cadena llamada look, y por ultimo con la sentencia updateComponentTreeUI() del modulo SwingUtilities actualizaremos el tema de los componentes, de no poner está ultima linea nuestra aplicación no aplicará el tema seleccionado.

Y así funcionará nuestra aplicación:






Seleccionamos en el jComboBox el tema que nos guste, y luego damos click en el botón Cambiar Look que ejecutará la porción de código que agregamos a su evento. Este ejemplo se los dejaré en ESTE ENLACE para que lo puedan probar, Deben abrirlo con Netbeans 7.3 y tener instalado el JDK 1.7 update 21, en dado caso no tuvieran alguno de estos dos, pueden bajarlo y abrir con un Notepad el archivo GUI.java  para verificar el código e implementarlo en el entorno que tengan ya que no utilicé ninguna herramienta especial de Netbeans o del JDK 7.... Esto es compatible desde el JDK 1.6.... espero que les sea de utilidad

13 comentarios:

  1. El mejor post que he visto en mi vida, y mas con los temas de java, esto hace que además de dinámicos sean los temas, más amble y amigable para el cliente, es decir, se puede poner a jugar con los temas, entre un cambio y otro. Mi pregunta es: No hay más temás o solo esos?
    Saludos, Jose

    ResponderEliminar
  2. Gracias José, muy pocas personas saben apreciar guias así.Respecto a temas claro que hay en forma de librerias (.jar) solo las agregas al proyecto y colocas el nombre tal y como se muestra arriba. Ahora si esos temas te los debo, solo es que busques un poco. Saludos

    ResponderEliminar
  3. Perfectamente explicado, paso a paso, facil y sencillo de entender, mil gracias.

    ResponderEliminar
  4. Muy buen post, me sirvió de mucho.
    Gracias

    ResponderEliminar
  5. Excelente Explicación, GRACIAS!!!!!

    ResponderEliminar
  6. Muchas gracias amigo, de tantos tutoriales que vi, este fue el único que me funciono, sencillo, justo lo que uno está buscando!

    ResponderEliminar
  7. Link caido :c pero muy bien explicado!

    ResponderEliminar
  8. Gracias compañero me sirvió la info, para darle un poco de gracia al gui de un proyecto

    ResponderEliminar

Tienes Dudas, comentarios o alguna inquietud?
No Dudes en comentar