Cambiar el aspecto LookAndFeel en Java

Cambiar la decoración LookAndFeel de un programa Java eligiendo entre 3 opciones: Nimbus, Metal y Motif, utilizando el método setLookAndFeel de la clase UIManager

Java permite modificar el aspecto de sus ventanas y cuadros de diálogo. Se definen 3 decoraciones básicas que son:

  • Metal: decoración que se adapta al sistema operativo, por ejemplo en Windows su aspecto se basa en ese sistema y en macOS su aspecto es Aqua
  • Nimbus: decoración más moderna y elegante, aparecida en Java 6
  • Motif: decoración más ruda que era la que se usaba por defecto en sistemas Unix.

Si no se define la decoración LookAndFeel (LAF en adelante) se utiliza la que se corresponda con el sistema operativo. Para definir un LAF hay que utilizar el método setLookAndFeel de la clase UIManager. En el método Main de entrada al programa es donde se inserta el código.

El método setLookAndFeel ha de ser llamado dentro de un bloque que pueda capturar las excepciones que se produzcan, de no hacerlo así el compilador da error. Primero se llama a la decoración por defecto del sistema para los contenedores de primer nivel que son JFrame y JDialog, después se llama al método que define el LAF y por último se instancia la clase principal del programa. En este ejercicio se han escrito las líneas de código de las diferentes decoraciones para dejar descomentada la que se desea utilizar y comprobar los resultados.

// METODO DE ENTRADA AL PROGRAMA
public static void main(String[] args) {

// configurar el LAF, es obligatorio que setLookAndFeel sea llamado capturando excepciones
try{
	
	// LAF del sistema por defecto 
	JFrame.setDefaultLookAndFeelDecorated(true);
	JDialog.setDefaultLookAndFeelDecorated(true);

	// método que selecciona la decoración LAF, se comentan todos menos el preferido
	UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
	// MetalLookAndFeel elige el del sistema operativo, en Windows su aspecto es igual a WindowsLookAndFeel
	//UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
	//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
	//UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

	//cuadro de mensaje que informa del LAF actual
	JOptionPane.showMessageDialog(null, "LookAndFeel: " + UIManager.getLookAndFeel().toString(), "LAF", JOptionPane.PLAIN_MESSAGE);
}
catch (Exception e)
 {
  e.printStackTrace();
 }

// instancia de la clase principal, hereda de JFrame
new Botones_fotos();
}

Se muestra un mensaje que informa del LAF actualmente definido. Esta información se obtiene con el método getLookAndFeel que devuelve una cadena bastante larga. Para acortarla y mostrar solamente el nombre del LAF se utiliza una cadena que recoge la información del LAF actual y elimina lo que hay antes del último punto y también el último carácter que es ]:

// cadena para contener el nombre del LAF actual
String laf = UIManager.getLookAndFeel().toString();
// sólo debe aparecer el nombre corto por ejemplo "NimbusLookAndFeel" en lugar del largo
// "[Nimbus Look And Feel com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel]"
// se recorta la cadena a lo que hay después del último . y se quita el último carácter que es ]
laf = laf.substring(laf.lastIndexOf(".")+1, laf.length()-1);
//cuadro de mensaje que informa del LAF actual
JOptionPane.showMessageDialog(null, "LookAndFeel: " + laf, "LAF", JOptionPane.PLAIN_MESSAGE);

Este ejercicio se basa en este artículo, la única variación es el código añadido para configurar la decoración de las ventanas. Puedes descargar el programa completo desde aquí.