[titulo]ASPECTO Y SENSACION[/titulo]
Ya hemos visto durante todo este capítulo que Swing constituye una mejora significativa de AWT. Y eso no va a ser solo porque Swing proporcione al programador un número mayor y más vistoso de componentes para desarrollar una interfaz gráfica, sino también porque dichas componentes van a ser independientes de la plataforma, lo cual permite cambiar el
aspecto y sensación (más conocido como L&F
(Look & Feel)) de los mismos.
Dicho de alguna forma, el aspecto y sensación de un programa es la forma en la que el programa se presenta al usuario (aspecto) y la forma en la que el usuario interactua con él (sensación). Por tanto, el aspecto y sensación quedan determinados por la forma en la que se muestra la ventana u otras componentes GUI y la manera en la que el usuario trabaja con ellas. La mayoría de los sistemas operativos que soportan ventanas y otras componentes GUI, como Windows, Macintosh, UNIX ...etc., tienen un aspecto y sensación fijos y predeterminados (no es lo mismo trabajar con ventanas en Windows que en Macintosh). La capacidad que tienen las componentes Swing de ser independientes de la plataforma permite que determinada ventana o componente GUI pueda presentarse con un aspecto y sensación de máquina Macintosh o UNIX dentro de un sistema que trabaja con sistema operativo Windows.
La capacidad de poder cambiar de aspecto y sensación es lo que se conoce con el nombre de
Aspecto y Sensación Conectables (PL&F). El L&F de una componente se implementa en términos de un
delegado, que es un objeto usado para mostrar dicha componente e interactuar con el usuario. Toda componente Swing tiene un delegado y un modelo únicos. Por ejemplo, los modelos de las componentes JButton deben implementar la interfaz ButtonModel, y los delegados de dichas componentes deben implementar la interfaz ButtonUI. Los métodos utilizados para acceder al modelo de una componente son getModel() y setModel(). De igual manera, los métodos para acceder al delegado de una componente son getUI() y setUI().
ASPECTO Y SENSACION DISPONIBLES EN JAVA Los delegados proporcionan la base para modificar el aspecto y sensación de una componente, por lo que hablaremos de
delegados disponibles en Java, en vez de
aspecto y sensación disponibles en Java. Los delegados que incorpora el JDK 1.2 son: .
- javax.swing.plaf.metal: aspecto y sensación Metal. Es el aspecto y sensación por defecto. Un ejemplo sería:
- com.sun.java.swing.plaf.windows: aspecto y sensación Windows. Un ejemplo de este tipo de aspecto y sensación sería:
- com.sun.java.swing.plaf.motif: aspecto y sensación Motif. Una imagen de ejemplo de este tipo de aspecto y sensació sería:
Los paquetes de aspecto y sensación anteriores contienen clases que implementan las correspondientes interfaces delegadas. Por ejemplo, el paquete javax.swing.plaf.metal proporciona la clase MetalButtonUI.
Además de los 3 delegados anteriores existen otros 3 más, pero de menor importancia:
- Aspecto y sensación básico: se trata de una clase abstracta y define un aspecto y comportamiento muy básico, a partir del cual (y mediante la implementación de dicha clase abstracta) el programador podrá definir un aspecto y sensación personalizado.
- Aspecto y sensacion mac: define el aspecto y sensación típico de las máquinas Macintosh. Aparece en el paquete com.sun.java.swing.plaf.mac. Pero, y en el supuesto que usted utilizando un PC, es posible que su JDK no lo incluya. Esto es debido a que este paquete no forma parte de swing ni de JDK, distribuyéndose únicamente y de forma separada en versiones para MacOS.
- Aspecto y sensación orgánico.
Las imágenes anteriores corresponden a un programa que permite cambiar el aspecto y sensación de una ventana dinámicamente. El código fuente será estudiado en el último apartado de este capítulo.
NOTA: el código fuente de la aplicación anterior aparece explicado en su totalidad al final de este apartado. Pero no obstante, si usted quiere ejecutarlo, a fin de ver el comportamiento de la aplicación, podrá encontrarlo en el archivo
AspectoySensacion.java. Para ejecutarlo, no tendrá mas que teclear
java AspectoySensación.
CAMBIAR EL ASPECTO Y SENSACION Para cambiar el aspecto y sensación de una componente, todo lo que hay que hacer es cambiar el delegado de dicha componente. Se realizará mediante el método setUI().
Ejemplo:
JButton mibutton=new JButton("Aceptar"); mibutton.setUI(new MetalButtonUI());De esta forma se cambia el aspecto y sensación a Metal. Esto a priori, y en este caso, no sería necesario debido a que Swing define el aspecto y sensación Metal como estándar en los applets y aplicaciones de Java que emplean componentes Swing. Si en vez de un L&F Metal quisieramos un L&F Motif, se haría de la forma:
mibutton.setUI(new MotifButtonUI());De esta manera podemos cambiar el aspecto y sensación de una sola componente. En el caso de que tuvieramos un applet con 30 componentes y quisieramos cambiar el L&F de todas ellas, hacerlo de la manera anterior sería muy pesado e ineficaz. Por ello, la clase UIManager de
javax.swing proporciona el método
setLookAndFeel() que permite modificar el aspecto y sensación de todas las componentes de una applet o aplicación.
Ejemplo:
try { UIManager.setLookAndFeel("java.awt.swing.plaf.Motif"); }catch(Exception e) { System.out.println(e); }Se debe atrapar una posible excepción debido a que existen dos versiones del método setLookAndFeel():
1. Toma como parámetro el nombre del paquete de aspecto y sensación (la utilizada en el ejemplo anterior). Esta versión provoca la excepción
LookAndFeelException.
2. Toma como parámetro el nombre de un objeto de la clase LookAndFeel y provoca una excepción del tipo
ClassNotFound.
CODIGO FUENTE DEL EJEMPLO En este apartado se explicará únicamente la parte del código fuente que tenga relación con el aspecto y sensación de las componentes.
1. En primer lugar debemos importar los paquetes necesarios para el tratamiento del aspecto y sensación.
..... import javax.swing.plaf.metal.*; import com.sun.java.swing.plaf.motif.*; import com.sun.java.swing.plaf.windows.*; .....2. En segundo lugar debemos instanciar un objeto de cada aspecto y sensación que vamos a utilizar.
..... MetalLookAndFeel MetalLF=new MetalLookAndFeel(); WindowsLookAndFeel WindowsLF=new WindowsLookAndFeel(); MotifLookAndFeel MotifLF=new MotifLookAndFeel(); .....3. En último lugar explicaremos la clase utilizada para manejar los eventos. Esta clase realiza las siguientes tareas:
- captura el evento producido por la pulsación de un botón.
- obtiene cúal de los 3 botones (cada uno perteneciente a un aspecto y sensación determinado) fué pulsado
- una vez obtenido el botón pulsado, se modificará consecuentemente el aspecto y sensación.
..... class TratarBotones implements ActionListener { public void actionPerformed (ActionEvent e) { String opcion=e.getActionCommand(); // obtenemos la opción elegida if (opcion.equals("L&F Motif")) { // si el botón es el de motif try { UIManager.setLookAndFeel(MotifLF); // cambiamos el aspecto y sensación SwingUtilities.updateComponentTreeUI(AspectoySensacion.this); } catch (Exception ex) { System.out.println(ex); // si se produjo la excepción la mostramos } } else if (opcion.equals("L&F Metal")) { // si el botón es el de metal try { UIManager.setLookAndFeel(MetalLF); // cambiamos el aspecto y sensación SwingUtilities.updateComponentTreeUI(AspectoySensacion.this); } catch (Exception ex) { System.out.println(ex); // si se produjo la excepción la mostramos } } else if (opcion.equals("L&F Windows")) { // si el botón es el de windows try { UIManager.setLookAndFeel(WindowsLF); // cambiamos el aspecto y sensación SwingUtilities.updateComponentTreeUI(AspectoySensacion.this); } catch (Exception ex) { System.out.println(ex); // si se produjo la excepción la mostramos } } } }