El paquete Swing es el nuevo paquete gráfico que ha aparecido en la versión 1.2 de Java. Está compuesto por un amplio conjunto de componentes de interfaces de usuario que funcionen en el mayor número posible de plataformas.
Cada uno de los componentes de este paquete puede presentar diversos aspectos y comportamientos en función de una biblioteca de clases. En la versión 1.0 de Swing, que corresponde a la distribuida en la versión 1.2 de la API de Java se incluyen tres bibliotecas de aspecto y comportamiento para Swing:
metal.jar: Aspecto y comportamiento independiente de la plataforma.
motif.jar: Basado en la interfaz Sun Motif.
windows.jar: Muy similar a las interfaces Microsoft Windows 95.
La siguiente imagen muestra una aplicación de ejemplo (adjunta al JDK 1.2) que muestra las diferentes interfaces para una misma aplicación según se utilice una u otra biblioteca:
Imagen 8: Diferentes aspectos de una interfaz Swing
Es la nueva clase denominada UiManager la que se encarga del aspecto y comportamiento de una aplicación Swing en un entorno de ejecución.
En el apartado "VI.3. Ejemplo de creación de una applet" se muestra un breve ejemplo de cómo utilizar las clases de Swing para crear una aplicación utilizando Swing.
B. Nuevas características
La arquitectura Swing presenta una serie de ventajas respecto a su antecedente AWT:
Amplia variedad de componentes: En general las clases que comiencen por "J" son componentes que se pueden añadir a la aplicación. Por ejemplo: JButton.
Aspecto modificable (look and feel): Se puede personalizar el aspecto de las interfaces o utilizar varios aspectos que existen por defecto (Metal Max, Basic Motif, Window Win32).
Arquitectura Modelo-Vista-Controlador: Esta arquitectura da lugar a todo un enfoque de desarrollo muy arraigado en los entornos gráficos de usuario realizados con técnicas orientadas a objetos. Cada componente tiene asociado una clase de modelo de datos y una interfaz que utiliza. Se puede crear un modelo de datos personalizado para cada componente, con sólo heredar de la clase Model.
Gestión mejorada de la entrada del usuario: Se pueden gestionar combinaciones de teclas en un objeto KeyStroke y registrarlo como componente. El evento se activará cuando se pulse dicha combinación si está siendo utilizado el componente, la ventana en que se encuentra o algún hijo del componente.
Objetos de acción (action objects): Estos objetos cuando están activados (enabled) controlan las acciones de varios objetos componentes de la interfaz. Son hijos de ActionListener.
Contenedores anidados: Cualquier componente puede estar anidado en otro. Por ejemplo, un gráfico se puede anidar en una lista.
Escritorios virtuales: Se pueden crear escritorios virtuales o "interfaz de múltiples documentos" mediante las clases JDesktopPane y JInternalFrame.
Bordes complejos: Los componentes pueden presentar nuevos tipos de bordes. Además el usuario puede crear tipos de bordes personalizados.
Diálogos personalizados: Se pueden crear multitud de formas de mensajes y opciones de diálogo con el usuario, mediante la clase JOptionPane.
Clases para diálogos habituales: Se puede utilizar JFileChooser para elegir un fichero, y JColorChooser para elegir un color.
Componentes para tablas y árboles de datos: Mediante las clases JTable y JTree.
Potentes manipuladores de texto: Además de campos y áreas de texto, se presentan campos de sintaxis oculta JPassword, y texto con múltiples fuentes JTextPane. Además hay paquetes para utilizar ficheros en formato HTML o RTF.
Capacidad para "deshacer": En gran variedad de situaciones se pueden deshacer las modificaciones que se realizaron.
Soporte a la accesibilidad: Se facilita la generación de interfaces que ayuden a la accesibilidad de discapacitados, por ejemplo en Braille.
C. Principales clases
Las clases de Swing se parecen mucho a las de AWT.
Todas las clases explicadas en el apartado "IV.2 AWT" de este tutorial tienen una nueva versión en Swing con el prefijo J. Así la clase Panel de AWT tiene una clase JPanel en Swing. Esto se cumple para todas las clases menos para Choice, Canvas, FileDialgog y ScrollPane.
De hecho todas las clases componentes de Swing (clases hijas de JComponent), son hijas de la clase Component de AWT.
ButtonGroup: Muestra una lista de elementos (JRadioButton) con solo uno seleccionable. Cada elemento tiene un círculo, que en caso del elemento seleccionado contendrá un "punto".
JToggleButton: Es como un botón normal, pero al ser pinchado por el usuario queda activado.
JProgressBar: Representa una barra de estado de progreso, mediante la que habitualmente se muestra el desarrollo de un proceso en desarrollo (ejemplo: la instalación de una aplicación).
JTabbedPane: Es una ventana con solapas (la que utiliza Windows). Este componente había sido muy solicitado.
JApplet: Aunque ya existía una clase Applet en AWT, esta nueva versión es necesaria para crear applets Java que utilicen interfaces Swing.
Por supuesto Swing no se limita a estas clases, sino que posee muchas más con diversas funcionalidades. Para estudiarlas consulte la documentación del JDK 1.2 de Java.
D. Nuevos gestores de impresión
Swing incorpora nuevos gestores de impresión, ampliando los cinco que AWT incorporaba. Entre ellos conviene destacar los siguientes:
BoxLayout: Es similar al FlowLayout de AWT, con la diferencia de que con él se pueden especificar los ejes (x o y). Viene incorporada en el componente Box, pero está disponible como una opción en otros componentes.
OverlayLayout: Todos los componentes se añaden encima de cada componente previo.
SpringLayout: El espacio se asigna en función de una serie de restricciones asociadas con cada componente.
ScrollPaneLayout: Incorporado en el componente ScrollPane.
ViewportLayout: Incorporado en el componente Viewport.
E. JrootPane
La clase JRootPane permite colocar contenido de las applets creadas con la clase JApplet en un determinado plano de impresión (capa).
Por orden de cercanía al usuario, estas capas son:
glassPane: Una capa que abarca toda la parte visible (por defecto no es visible).
layeredPane: Una subclase de JComponent diseñada para contener cuadros de diálogo, menús emergentes y otros componentes que deben aparecer flotando entre el usuario y el contenido.
menubar: Una capa opcional, que si aparece estará anclada en la parte superior.
contenPane: La capa en que se dibujará la mayor parte del contenido.
Así pues cada vez que se vayan a añadir componentes a una applet de clase JApplet, debe añadirse a uno de estas capas. Por ejemplo:
laJApplet.getContentPane().add( unComponente );
F. Nuevos eventos de Swing
Swing incorpora su nuevo conjunto de eventos para sus componentes.
a.) Eventos físicos
Sólo aparecen dos nuevos eventos físicos, descendientes de InputEvent:
MenuKeyEvent: Un menú de árbol ha recibido un evento de KeyEvent (acción sobre el ratón).
MenuDragMouseEvent: Un menú de árbol ha recibido un evento de MouseEvent (pulsación de una tecla).
b.) Eventos semánticos
Son todos hijos del evento de AWT AWTEvent, que es el evento base de la jerarquía de eventos:
AncestorEvent: Antecesor añadido desplazado o eliminado.
CaretEvent: El signo de intercalación del texto ha cambiado.
ChangeEvent: Un componente ha sufrido un cambio de estado.
DocumentEvent: Un documento ha sufrido un cambio de estado.
HyperlinkEvent: Algo relacionado con un vínculo hipermedia ha cambiado.
InternalFrameEvent: Un AWTEvent que añade soporte para objetos JInternalFrame.
ListDataEvent: El contenido de una lista ha cambiado o se ha añadido o eliminado un intervalo.
ListSelectionEvent: La selección de una lista ha cambiado.
MenuEvent: Un elemento de menú ha sido seleccionado o mostrado o bien no seleccionado o cancelado.
PopupMenuEvent: Algo ha cambiado en JPopupMenu.
TableColumnModelEvent: El modelo para una columna de tabla ha cambiando.
TableModelEvent: El modelo de una tabla ha cambiado.
TreeExpansionEvent: El nodo de un árbol se ha extendido o se ha colapsado.
TreeModelEvent: El modelo de un árbol ha cambiado.
TreeSelectionEvent: La selección de un árbol ha cambiado de estado.
UndoableEditEvent: Ha ocurrido una operación que no se puede realizar.