Java Swing
Java Swing
Junio, 2005
RESUMEN
Este documento pretende hacer una descripción de Swing, una de las APIs de Java, que se
incluye en las JFC 1.1.
En primer lugar se hace una introducción a Swing, describiendo el entorno en el que se
encuentra, tratando por ello algunos aspectos relacionados con AWT, JFC 1.1 y JDK 1.2.
Además, se realiza una breve descripción de las interfaces de usuario.
Posteriormente, se describe Swing con más profundidad, analizando su arquitectura y sus
componentes principales.
A continuación, se hace una pequeña introducción al manejo de eventos en Swing y a los
Applets.
Finalmente, se analiza por qué es útil convertir una aplicación a Swing y se dan unas
indicaciones para facilitar la conversión.
Y por último, se explican varios ejemplos de aplicaciones con Swing.
ABSTRACT
This document tries to make a description of Swing, one of the APIs of Java, which is included
in JFC 1.1.
First of all, this document makes an introduction to Swing, describing the IDE where it is,
dealing with some aspects related to AWT, JFC 1.1 and JDK 1.2. Besides, a short description
about the interfaces of user is made.
Afterwards, Swing is described more deeply, analysing its architecture and main
components.
Later, a small introduction about the management of events in Swing and the Applets is
made.
Eventually, why is useful to convert an application into Swing is analysed and some
indications are given to make easy the conversion.
Finally, some examples about applications with Swing are explained.
2
Programación con Swing
LISTA DE CONTENIDOS
3
Jose Luis García y Noelia Méndez
LISTA DE FIGURAS
4
Programación con Swing
LISTA DE TABLAS
5
Jose Luis García y Noelia Méndez
1. INTRODUCCIÓN AL TRABAJO
Este trabajo pretende ser una pequeña introducción a Swing, con la que se intenta mostrar al
lector una visión general sobre el mundo de las interfaces gráficas de usuario, y más
concretamente, sobre el desarrollo de éstas con Java y sus APIs. Puesto que tan sólo se trata de
una breve introducción al tema, lo que se pretende es captar la atención del lector y mostrar las
ventajas que ofrece éste tipo de programación.
En primer lugar, se realiza una introducción a Swing, el AWT y las interfaces de usuario,
tratando de ésta forma de centrar al lector en el tema a tratar.
Una vez realizada dicha introducción, se describirá brevemente el paquete Swing, para dar
una idea de la jerarquía de componentes que se puede utilizar con Swing y de sus utilidades.
También se mencionará el manejo de eventos en Swing, así como los Applets, aunque de
una forma muy superficial, ya que debido a la gran amplitud de variaciones que pueden darse,
sería muy extenso hacer una descripción detallada.
A continuación, se exponen los motivos por los que resulta interesante convertir las
aplicaciones a Swing.
Para terminar, se examinarán más concretamente dos de las clases que ofrece Swing: la
clase Tabbed Pane y la clase Menu.
Para aquellas personas que después de leer este documento se sientan atraídas por la
construcción de interfaces gráficas de usuario con Swing, al final del documento se incluyen las
referencias, para facilitar la búsqueda de información a todo el que desee profundizar en el
tema.
2. INTRODUCCIÓN A SWING
Swing es una de las mejoras principales que ha experimentado el JDK en su versión 1.2 con
respecto a la versión 1.1, y representa la nueva generación de AWT. También es una de las API
de las Clases de Fundamentos de Java (JFC), lo cual es el resultado de un esfuerzo de
colaboración muy grande entre Sun, Netscape, IBM y otras empresas. Lo que da a Swing su
importancia es el poder que ofrece para desarrollar interfaces gráficas de usuario (GUI) para
applets y aplicaciones. La cantidad y calidad de los controles GUI que ofrece Swing no tiene
rival en ningún otro juego de herramientas GUI.
El origen de los controles GUI que presenta Swing lo encontramos en las Clases de
Fundamentos de Internet de Netscape (IFC). Los componentes Swing van más allá de las IFC,
hasta el punto de que no hay un parecido apreciable entre los componentes Swing y los de las
IFC. Swing ofrece también la posibilidad de cambiar fácil y rápidamente el aspecto y sensación
(L&F) de un único componente o grupo de componente. Esta posibilidad, que se conoce como
aspecto y sensación conectables (PL&F), es un sello distintivo de Swing.
6
Programación con Swing
Al nivel más bajo, el sistema operativo transmite información desde el ratón y el teclado
como dispositivos de entrada al programa. El AWT fue diseñado pensando en que el
programador no tuviese que preocuparse de detalles como controlar el movimiento del ratón o
leer el teclado, ni tampoco atender a detalles como la escritura en pantalla. El AWT constituye
una librería de clases orientada a objeto para cubrir estos recursos y servicios de bajo nivel.
Debido a que el lenguaje de programación Java es independiente de la plataforma en que se
ejecuten sus aplicaciones, el AWT también es independiente de la plataforma en que se ejecute.
El AWT proporciona un conjunto de herramientas para la construcción de interfaces gráficas
que tienen una apariencia y se comportan de forma semejante en todas las plataformas en que se
ejecute. Los elementos de interfaz proporcionados por el AWT están implementados utilizando
toolkits nativos de las plataformas, preservando una apariencia semejante a todas las
aplicaciones que se creen para esa plataforma. Este es un punto fuerte del AWT, pero también
tiene la desventaja de que un interfaz gráfico diseñado para una plataforma, puede no
visualizarse correctamente en otra diferente. Estas carencias del AWT son subsanadas en parte
por Swing, y en general por las JFC.
JFC
AWT
IFC Swing
La Figura 1 muestra la relación existente entre Swing, el AWT y las JFC. Las JFC subsumen y
amplían el AWT original, y constan de las siguientes API principales:
- AWT.
- Swing.
- Java 2D.
- Drag-and-Drop.
- Accessibility.
Aunque Swing esté separado del AWT, se implementa en términos de clases AWT básicas.
El AWT proporciona la interfaz entre el sistema de ventanas nativo subyacente y los
componentes GUI de Java. Swing utiliza esta interfaz, pero no se apoya en componentes del
AWT para hacer uso de objetos nativos. En lugar de ello, los componentes Swing están escritos
en Java puro. Esto ofrece ventajas significativas. Permite a los componentes Swing ser
independientes del sistema de ventanas nativo, lo cual implica que pueden ejecutarse en
cualquier sistema de ventanas que admita el AWT. También permite a los componentes Swing
ser independientes de cualquier limitación de los sistemas de ventanas nativos. Esta
independencia permite a Swing controlar y adaptar su aspecto y sensación (de ahí la aparición
de PL&F).
Entre los componentes nuevos que incluye Swing hay desde paneles tabulados y bordes
estilizados hasta barras deslizadoras y efectos giratorios. Estos componentes nuevos, en sí
mismos, hacen que Swing constituya un agregado de primera magnitud a la API Java. La galería
de componentes Swing, que se encuentra en http://java.sun.com/products/jfc/swingdoc-
7
Jose Luis García y Noelia Méndez
8
Programación con Swing
JComponent
• AbstractButton
• JButton
• JMenuItem
• JCheckBoxMenuItem
• JMenu
• JRadioButtonMenuItem
• JToggleButton
• JCheckBox
• JRadioButton
• JComboBox
• JInternalFrame
• JLabel
• DefaultTableCellRenderer(java.awt.swing.table)
• JLayeredPane
• JDesktopPane
• JList
• JMenuBar
• JOptionPane
• JPanel
• ColorChooserPanel
• JPopupMenu
• JProgressBar
• JRootPane
• JScrollBar
• JScrollPane
• JSeparator
• JSlider
• JSplitPane
• JTabbedPane
• JTable
• JTableHeader(java.awt.swingn.table)
• JTextComponent(java.awt.swing.text)
• JEditorPane
• JTextPane
• JTextArea
• JTextField
• JPasswordField
• JToolBar
• JToolTip
• JTree
• JViewport
9
Jose Luis García y Noelia Méndez
10
Programación con Swing
11
Jose Luis García y Noelia Méndez
Cada evento está representado por un objeto que ofrece información sobre el evento e
identifica la fuente. Las fuentes de los eventos normalmente son componentes, pero otros tipos
de objetos también pueden ser fuente de eventos. Como muestra la siguiente figura, cada fuente
12
Programación con Swing
de evento puede tener varios oyentes registrados. Inversamente, un sólo oyente puede registrarse
con varias fuentes de eventos.
9. APPLETS DE SWING
La clase JApplet es el equivalente de Swing de la clase Applet. JApllet se parece a
JFrame en que admite un panel de contenido separado. A este contenedor se accede a través
del método getContentPane(). La barra de menús debe ser un objeto de la clase
JMenuBar.
13
Jose Luis García y Noelia Méndez
Dado que Swing ofrece componentes GUI que son equivalentes a los componentes del AWT,
resulta fácil convertir las aplicaciones y applets a Swing. Las aplicaciones se convierten a
Swing reemplazando la clase Frame por la clase JFrame y utilizando getContentPane()
para acceder al contenedor del marco. Los componentes GUI que se hubieran añadido al Frame
se añaden al contenedor del marco. Los applets se convierten deforma parecida con la clase
JApplet reemplazando a la clase Applet. La mayor parte de los componentes GUI del
AWT pueden convertirse a Swing anteponiendo al nombre de la clase de AWT la letra ‘J’.
11. EJEMPLOS
Puesto que Swing tiene una gran cantidad de componentes y sería demasiado extenso detallar
cada uno de éstos, a continuación se analizan de forma detallada sólo dos de ellos. Para conocer
el funcionamiento del resto de los componentes, en la bibliografía se muestran algunas
referencias para encontrar la información necesaria.
10.1 Cómo utilizar la Clase Tabbed Pane
10.1.1 ¿Qué es la clase Tabbed Pane?
Con la clase JTabbedPane, podemos tener varios componentes (normalmente objetos
JPanel) compartiendo el mismo espacio. El usuario puede elegir qué componente ver
seleccionando la pestaña del componente deseado.
10.1.2 Construir una aplicación con un Tabbed Pane
Para crear un TabbedPane, simplemente se ejemplariza un JTabbedPane, se crean los
componentes que deseemos mostrar, y luego los añadimos al TabbedPane utilizando el
método addTab.
Compilando y ejecutando el siguiente código, se obtiene como resultado la ventana que
aparece representada en la Figura 5.
14
Programación con Swing
15
Jose Luis García y Noelia Méndez
int indexOfTab(Icon)
void setSelectedIndex(int) Selecciona la pestaña que tiene el índice o
void componente especificado.
setSelectedComponent(Component) Seleccionar una pestaña tiene el efecto de
mostrar su componente asociado.
16
Programación con Swing
17
Jose Luis García y Noelia Méndez
Como se ve en la figura 7, los ítems de menús (incluidos los propios menús) son simples
botones. Un menú, a pesar de ser un botón, muestra sus ítems ya que cuando se activa,
automáticamente trae un menú desplegable que muestra sus ítems.
10.2.3 Construir una aplicación con un Menú
A continuación tenemos el fragmento de código que crea los menús mostrados en la figura 4.
Como este código no tiene manejo de eventos, los menús no hacen nada útil, excepto verse
como serían. Si se ejecuta el ejemplo, observaremos que a pesar de no tener un manejo de
eventos, los menús y submenús aparecen cuando deben, y los checkbox y los botones de radio
responden apropiadamente cuando el usuario los elige.
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Another one");
menu.add(cbMenuItem);
//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
menuItem = new JMenuItem("An item in the submenu");
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);
//Build second menu in the menu bar.
menu = new JMenu("Another Menu");
menuBar.add(menu);
Como se ve en el código, para configurar una barra de menú para un JFrame, se utiliza el
método setJMenuBar. Para añadir un JMenu a un JMenuBar, se utiliza el método
add(JMenu). Para añadir ítems de menú y submenús a un JMenu, se utiliza el método
add(JMenuItem). Estos métodos y otros más se listan en El API de JMenu.
10.2.4 Manejar Eventos desde Ítems de Menús
Para detectar cuando el usuario selecciona un JMenuItem, se puede escuchar por eventos
action (igual que se haría para un JButton). Para detectar cuando el usuario selecciona un
JRadioButtonMenuItem, se puede escuchar tanto por eventos action, como por eventos
item. Para JCheckBoxMenuItems, generalmente se escuchan eventos de item.
La figura 8 muestra un programa que añade detección de eventos al ejemplo anterior.
18
Programación con Swing
19
Jose Luis García y Noelia Méndez
Para las plataformas Windows y Motif, el usuario trae un menú desplegable pulsando el
botón derecho del ratón mientras el cursor está sobre el componente adecuado. El oyente de
mouse trae un menú desplegable llamando a setVisible(true) sobre el ejemplar
apropiado de JPopupMenu.
El siguiente fragmento de código, muestra cómo crear y mostrar menús desplegables:
...//where instance variables are declared:
JPopupMenu popup;
...//where the GUI is constructed:
//Create the popup menu.
popup = new JPopupMenu();
menuItem = new JMenuItem("A popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);
menuItem = new JMenuItem("Another popup menu item");
menuItem.addActionListener(this);
popup.add(menuItem);
//Add listener to components that can bring up popup menus.
MouseListener popupListener = new PopupListener();
output.addMouseListener(popupListener);
menuBar.addMouseListener(popupListener);
...
class PopupListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(),
e.getX(), e.getY());
}
}
}
20
Programación con Swing
Los menús desplegables tienen unos pocos detalles interesantes de implementación. Uno es que
cada menú tiene un menú desplegable apropiado. Cuando el menú se activa, utiliza su menú
desplegable para mostrar sus ítems de menú.
Otro detalle es que un propio menú desplegable utiliza otro componente para implementar
la ventana que contiene los ítems del menú. Dependiendo de las circunstancias bajo las que se
muestre el menú desplegable, podría implementar su "ventana" utilizando un componente de
peso ligero (como un JPanel), un componente de peso medio (como un Panel), o una
ventana de peso pesado (Window).
Las ventanas desplegables de peso ligero son más eficientes que las ventanas de peso
pesado, pero no funcionan bien si tenemos componentes pesados dentro de nuestro GUI.
Específicamente, cuando un área de una ventana desplegable de peso ligero se intersecciona con
un componente de peso pesado, el componente de peso pesado se dibuja encima. Esta es una de
las razones por la que se recomienda no mezclar componentes de peso ligero y de peso pesado.
Si realmente se necesita utilizar un componente de peso pesado en el GUI, se puede utilizar el
método setLightWeightPopupEnabled de JPopupMenu para desactivar las ventanas
desplegables de peso ligero.
10.2.5 Personalizar la Distribución de un Menú
Como los menús se hacen con componentes ordinarios Swing, se pueden personalizar
fácilmente. Por ejemplo, se puede añadir cualquier componente de peso ligero a un JMenu o
JMenuBar. Y como JMenuBar utiliza BoxLayout, se puede personalizar la distribución de
la barra de menú añadiéndole componentes invisibles. Aquí mostramos un ejemplo que añade
un componente glue a una barra de menú, para que el último elemento del menú se sitúe en el
lado derecho de la barra de menú:
...//create and add some menus...
menuBar.add(Box.createHorizontalGlue());
...//create the LEFTmost menu...
menuBar.add(LEFTMenu);
21
Jose Luis García y Noelia Méndez
22
Programación con Swing
23
Jose Luis García y Noelia Méndez
12. CONCLUSIONES
Swing es un API que ofrece JFC 1.1, y representa la nueva generación de AWT. Swing amplía
AWT proporcionando muchos más tipos de componentes GUI, ofreciendo implementaciones
cien por cien Java puro a estos componentes y permitiendo adaptar fácilmente el aspecto y
comportamiento de tales componentes, facilitando así el trabajo de los programadores.
El que los componentes de Swing sean cien por cien Java puro implica que no dependen de
ninguna implementación nativa de ventanas que les de soporte, y que además estén disponibles
y sean consecuentes en todo tipo de plataforma.
24
Programación con Swing
25
Jose Luis García y Noelia Méndez
13. BIBLIOGRAFÍA
- http://www.programacion.com/java/tutorial/swing/
- Manual - Programación - Java tutor Swing
- http://jungla.dit.upm.es/~santiago/docencia/apuntes/Swing/
- Java 1.2 Al descubierto. Jaime Jaworski
- Sun’s Java Swing Tutorial
- Java Swing Tutorial (2005)
- Lenguaje de programación Java
26