Java Look & Feel – Parte 1

11 febrero, 2010 por Herman Barrantes Dejar una respuesta »

Normalmente las ventanas Java tienen su propio aspecto, su propio estilo de botones y demás. Java cuenta con 2 librerías para diseñar interfaces gráficas (ventanas, botones, etiquetas, etc.), estas 2 librerías son: AWT y Swing.

Las ventanas hechas con AWT conservan el tema del Sistema Operativo, sin embargo, las ventanas hechas con Swing son muy fáciles de cambiar su aspecto (look and feel o skin) para que tengan aspecto java, aspecto windows, aspecto Linux, etc. Basta con tener la librería adecuada y unas líneas de código.

Poner Look and Feel del sistema operativo

Para obtener el aspecto de ventanas propio del sistema operativo en el que estemos (XP, Ubuntu, Mac OS, etc.), antes de crear cualquier ventana ejecuta:

import javax.swing.*;
...
try
{
	JFrame.setDefaultLookAndFeelDecorated(true);
	JDialog.setDefaultLookAndFeelDecorated(true);
	UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e)
{
 	e.printStackTrace();
}
...

Con UIManager.getSystemLookAndFeelClassName() obtenemos el nombre del Look and Feel por defecto del sistema operativo en el que estemos.

Con UIManager.setLookAndFeel decimos qué Look and Feel queremos usar.

Poner otro Look and Feel disponible

JRE instala algunos look and feel a parte del propio y el de el Sistema Operativo, los cuales puede ser usados.
Se utiliza el mismo código anterior excepto que en vez de usar UIManager.getSystemLookAndFeelClassName() ponemos un String con la ubicación de la librería de Look and Feel que queremos usar.

Metal Look and Feel

metal look and feel

Este es el tema predeterminado de Java, esta disponible para todos los Sistemas Operativos.

Para pode usarlo hacemos:

UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

Ninbus Look and Feel

ninbus look and feel

Este es el tema fue agregado por Java recientemente, esta disponible también para todos los Sistemas Operativos pero a partir de la versión 1.5 de Java.

Para pode usarlo hacemos:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

Windows Look and Feel

windows look and feel

Este es el tema nativo de Windows, tomará la apariencia del estilo actual de Windows (en XP normalmente el tema es Luna y en Seven y Vista es Aero, pero si se tiene otro también lo puede usar), esta disponible solo para el sistema Windows.

Para pode usarlo hacemos:

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

También existe el tema clásico de Windows (Win95 y Win98), para pode usarlo hacemos:

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

GTK Look and Feel

gtk look and feel

Este es el tema nativo de algunas distribuciones Linux, esta disponible también para todos los Sistemas Operativos Linux los cuales soporten GTK (normalmente los que usan GNOME como Ubuntu).

Para pode usarlo hacemos:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");

Aqua Look and Feel

aqua look and feel

Este es el tema nativo de Mac OS X, esta disponible para todos los Sistemas Operativos Mac OS X.

Para pode usarlo hacemos:
Para Mac OS X

UIManager.setLookAndFeel("com.apple.laf.AquaLookAndFeel");

o esta otra para Mac OS

UIManager.setLookAndFeel("com.sun.java.swing.plaf.mac.MacLookAndFeel");

Motif Look and Feel

motif look and feel

Este es el tema es el más antiguo de Java, esta disponible para todos los Sistemas Operativos. (también es el más feo :shock: )

Para pode usarlo hacemos:

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

Obtener la lista de los Look and Feel disponibles en mi Sistema Operativo

Podemos usar el siguiente código para obtener una lista con los Look and Feel disponibles:

import javax.swing.UIManager.*;
...
LookAndFeelInfo[] lista = UIManager.getInstalledLookAndFeels();
for (int i = 0; i < lista.length; i++) {
	System.out.println(lista[i].getClassName());
}
...

Esto es todo por esta vez, próximamente escribiré un nuevo post explicando como poner nuevos Look and Feel descargados de Internet… :smile: :razz: :grin:

Publicidad

17 comentarios

  1. German Raul dice:

    Gracias por el dato alfin le puedo quitar el horrible tema de metal que trae :grin:

  2. Jorge Alberto dice:

    Muchas gracias por el dato, pero tres preguntas…
    la línea

    UIManager.setLookAndFeel(“com.sun.java.swing.plaf.motif.MotifLookAndFeel”);

    1. debe ser siempre la primera???,
    2. o antes de que línea u operación debiera estar???
    3. se puede cambiar esto en tiempo de ejecución? (aunque sería trivial, jejeje)

    De antemano muchas gracias por la información y la posible respuesta.

    Saludos desde Mexicali (B.C. México)

  3. barrantesgerman dice:

    @Jorge Alberto

    1. no siempre debe de ser la primera, pero es mejor usarla antes de crear cualquier ventana para que funcione correctamente, en caso contrario ver respuesta a la pregunta 3

    2. es mejor usarla después de:

    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);

    las dos líneas anteriores son para que se aplique el Look And Feel (LAF) para el borde y título de la ventana, no todos los LAF tienen efecto sobre el borde y título (ejemplo de esto son: Nimbus y Motif), luego de esto, el LAF del borde y título de la ventana no se puede modificar excepto que se reinicie la aplicación.

    3. si se puede cambiar el LAF durante tiempo de ejecución pero solo lo aplicará a los componentes de la ventana y no al título y borde debido a lo que vimos en la pregunta 2, lo haces mediante la función:
    SwingUtilities.updateComponentTreeUI(this);

    esta es una función de ejemplo que podrías usar para ello:

    public void changeLookAndFeel(String laf)
    {
    	//si no se especifica tome la del sistema
    	if (laf==null) {
    		laf=UIManager.getSystemLookAndFeelClassName();
    	}
    	try {
    		//cambiar el LAF
    		UIManager.setLookAndFeel(laf);
    	}
    	catch (UnsupportedLookAndFeelException e) {
    		// handle exception
    		e.printStackTrace();
    	}
    	SwingUtilities.updateComponentTreeUI(this);
    }
    
  4. Jorge Alberto dice:

    @barrantesgerman

    Muchas gracias por la ayuda,
    seguiré visitando tus artículos que me son de
    gran ayuda. Saludos.

  5. KronoZ dice:

    Excelente Gracias por la información

  6. erick dice:

    Gracias ahora tendrásn una mejor apariencia mis programas, deberías hacer un toturial de esto mimo pero en un jFrame generado por netbeans 6.9, muchas gracias :smile:

  7. barrantesgerman dice:

    @erick
    El código que he puesto en esta entrada es totalmente genérico, yo programo en Netbeans 6.9 y nunca me ha dado ninguna clase de problema, solo crea un JFrame normalmente, dentro del código fuente en el método main colocamos la función para cambiar la apariencia, ejemplo:

    /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            try {
                JFrame.setDefaultLookAndFeelDecorated(true);
                JDialog.setDefaultLookAndFeelDecorated(true);
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    new ventana().setVisible(true);
                }
            });
        }
  8. Alberto dice:

    Gracias! estuve buscando esto y por fin lo encontré ^^ En mi caso estoy con NetBeans y éste, como ya sabemos, te genera parte del código cuando armas la aplicación visualmente… tuve que ponerlo así:

    public Interface() {
    /* Muestra la ventana de la aplicación con el theme usado en el sistema operativo */
    try
    {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    initComponents();
    /* Centra la ventana de la aplicación en el centro de la pantalla */
    setLocationRelativeTo(null);

    }

    Interface es el nombre de la variable de la ventana :P

    Saludos!

  9. Juan Tejeda dice:

    olle y como puedeo evitar que cuando use
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    y maximize la pantalla no lo haga en pantalla completa. con los otros como nimbus y el del sistema no me pasa eso ni conmetal sin estos bordes.

  10. Rodrigo dice:

    Es genial. Y justo andaba buscando algo parecido. Aunque tengo una duda, soy nuevo en el lenguaje y recien ahora estoy viendo todas las novedades que tiene el mismo. Me intriga saber de que manera se podria colocar, tal como esta en la imagen, un 2 menu de opciones. Algo parecido a lo que esta en la imagen el boton “jButton1″
    Desde ya gracias por la respuesta.

  11. Alan Reyes dice:

    Muchas gracias, la verdad es la mejor pagina que encontre acerca del Look&Feel

  12. Edgar Lazo dice:

    Gracias por el articulo. Es justo lo que andaba buscando.

  13. Jack Tejada dice:

    Quisiera utilizar la función y he copiado y pegado varios códigos directamente desde aquí a mi aplicación, pero parece que ninguno funciona, me podrías decir que tengo que usar, importar, instalar a priori de utilizar la función?

  14. Arturo Valencia dice:

    Hola amigo resulta que solo quiero colocar el “Windows Look and Feel” a los JOptionPane y a los JFileChooser pero que los JFrame y JDialog el “Metal Look and Feel” en una misma aplicacion como convinalos como le hago?

  15. Darwin Omar dice:

    Donde puedo descargar mas look, o esos son los unicos que existen… ??

Deja un comentario