Swing: Guı́a rápida
Manuel Urueña
19 de diciembre de 2002
1. Introducción
Dado el bajo rendimiento y las limitaciones de la librerı́a AWT1 de Java, se desarrolló una
segunda librerı́a de interfaces de usuario denominada Swing.
Realmente Swing sigue utilizando AWT para representar sus componentes. Sin embargo, no
es recomendable seguir usando AWT directamente, ni mezclar componentes de ambas librerı́as,
la práctica recomendada es diseñar aplicaciones Swing puras, sin ningún componente gráfico2
AWT.
2. Un ejemplo de aplicación Swing
import [Link].*;
import [Link].*;
import [Link].*;
public class HelloWorldSwing
{
public static void main ( String[] args )
{
JFrame frame = new JFrame("HelloWorldSwing");
final JLabel label = new JLabel("Hello World");
[Link]().add(label);
[Link](JFrame.EXIT_ON_CLOSE);
[Link]();
[Link](true);
}
}
Esta es una de las aplicaciones de Swing más sencillas que se pueden diseñar. Simplemente
crea una ventana con un tı́tulo y que contiene una frase en su interior.
La mayorı́a del código es auto-explicativo, exceptuando quizás las tres últimas operaciones.
El método setDefaultCloseOperation() es un atajo, muy util para la mayorı́a de las apli-
caciones, que indica el comportamiento que debe tener la aplicación cuando el usuario cierra
la ventana. En este caso cierra la aplicación3 .
Por otro lado las dos últimas operaciones simplemente agrupan los elementos dentro de la
ventana y la hacen visible.
1
Abstract Windows Toolkit
2
Los elementos no gráficos, como el modelo de eventos, siguen utilizandose en Swing
3
Si se elimina esta lı́nea del programa, la ventana no se cerrarı́a nunca
2
3. Contenedores principales en Swing
Toda aplicación de Swing debe definir algún tipo de contenedor principal para situar los
elementos gráficos de la misma.
A diferencia de AWT, los contenedores principales estan compuestos por múltiples ele-
mentos. Los más importantes son la barra de menú (getJMenuBar()) y el panel de contenidos
(getContentPane()). El panel de contenidos es el lugar donde deben situarse todos los ele-
mentos gráficos de la aplicación4 , a exception de la barra de menu.
Los contenedores principales más comunes de Swing son:
[Link] - Ventana principal.
[Link] - Ventana secundaria, depende de una principal.
[Link] - Applet en un navegador.
JFrame implementa la tı́pica ventana de una applicación GUI, con barra de tı́tulo, marco
y botones para cerrarla o minimizarla.
JDialog y sus subclases implementan los tı́picos diálogos para seleccionar un fichero
(JFileChooser) o pedir la confirmación del usuario (JOptionPane).
4. Elementos básicos
La mayorı́a de los componentes de Swing ya estaban definidos en AWT. Por ejemplo
[Link].JButton5 se puede emplear para reemplazar a un [Link].
[Link] - Botones.
[Link] - Etiquetas con texto.
[Link] - Campos de texto.
[Link] - Casillas de selección.
4
En AWT se podı́an añadir directamente ([Link](label)) mientras que en Swing es necesario utilizar el
ContentPane de contenedor principal ([Link]().add(label)).
5
Normalmente todos los componentes visuales de Swing comienzan con ’J’.
3
[Link] - Campos de seleción.
[Link] - Botones de seleción6 .
[Link] - Barra de selección.
[Link] - Barra de progreso.
[Link] - Barra de herramientas.
Swing ha cuidado un poco más el aspecto visual de las aplicaciones que AWT, ahora es
posible crear la mayorı́a de los elementos tanto con una cadena de texto como con un icono.
Además es posible introducir código HTML7 en los elementos de texto, como pueden ser
las etiquetas, de forma que es más simple utilizar negritas, cursivas o colores.
4.1. Menus
Una de las mejoras de Swing respecto a AWT es la posibilidad de añadir menús a las
aplicaciones gráficas. Como ya se ha visto en un apartado anterior, los contenedores principales
estan formados por varios elementos, entre ellos un objeto de tipo JMenuBar.
[Link] - La barra de menú.
[Link] - Un menú.
[Link] - Un elemento de menú.
6
Normalmente se utilizan con la clase [Link] para indicar que dos botones no pueden
estar seleccionados simultaneamente.
7
JLabel label = new JLabel(“<html><b>Negrita</b> y <i>Cursiva</i></html>”)
4
[Link] - Una casilla de selección de un menú.
[Link] - Un botón de selección de un menú.
Los menús se construyen jerarquicamente, los elementos de menú (JMenuItem y subcla-
ses) se añaden a un menú y los menús se añaden, o bien como submenús de otro menú, o
directamente a la barra de menú.
5. Paneles
Al igual que en AWT, los componentes de Swing se pueden agrupar y situar dento de la
aplicación mediante el uso de paneles. Estos son los tipos de panel más comunes de Swing:
[Link] - Panel vacı́o.
[Link] - Panel con barras de desplazamiento.
[Link] - Paneles superpuestos con pestañas.
[Link] - Panel dividido en dos secciones.
5.1. Layouts y bordes
Al igual que AWT, en Swing es posible indicar como deben situarse los elementos dentro
de un panel. Para ello se utilizan los LayoutManager definidos en AWT y se define alguno
más.
5
Además de los Layouts en Swing es posible definir decoraciones para los bordes de los
paneles. Por ejemplo, el siguiente fragmento de código configura el panel con un margen de 5
pixels en cada dirección y lo enmarca con un lı́nea etiquetada.
JPanel pane = new JPanel();
[Link](new BorderLayout());
[Link]([Link](
[Link]("Select Phase"),
[Link](5,5,5,5)));
6. Ventanas de diálogo
Uno de los componentes indispensables en los interfaces gráficos de hoy en dı́a son las
ventanas de diálogo. Son ventanas secundarias que se emplean para mostrar al usuario un
aviso, hacerle una pregunta o pedirle que seleccione un fichero.
Las ventanas de diálogo se denominan secundarias ya que suelen depender de otra ventana
principal, normalmente un JFrame. Es habitual que cuando se muestra una de estas pantallas
de diálogo el programa espera hasta que el cliente responda a dicho diálogo y no responde a
acciones del usuario sobre la ventana principal.
Aunque en Swing todas las ventanas de diálogo son subclases del contenedor principal
[Link], se suelen utilizar otras clases, como puede ser JOptionPane, que repre-
sentan tipos de cuadros de diálogo bien conocidos en los diseños GUI.
Por ejemplo un mensaje de aviso al usuario, con un botón para cerrarlo se genera con el
código siguiente:
//default title and icon
[Link](frame,
"This candidate is a dog. " +
"Invalid vote.");
6
En los cuadros de diálogo con múltiples opciones, el método que lanza la ventana suele de-
volver un valor con la elección que ha hecho el usuario. Por ejemplo, al ejecutar el siguiente códi-
go, la variable n tendrı́a uno de los valores: JOptionPane.YES_OPTION, JOptionPane.NO_OPTION,
JOptionPane.CANCEL_OPTION o JOptionPane.CLOSED_OPTION, en función de que el usuario
pulse el botón Sı́, No, Cancelar o cierre la ventana.
//default title and icon
Object[] options = {"Yes!",
"No, I’ll pass",
"Well, if I must"};
int n = [Link](frame,
"Duke is a cartoon mascot. \n"
+ "Do you still want to cast your vote?",
"A Follow-up Question",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);
Además de las ventanas de diálogo simples que hemos visto hasta ahora, en Swing están de-
finidos otros cuadros de diálogo más sofisticados como puede ser [Link]
o [Link].
En el caso de [Link], hay dos métodos para mostrar la ventana de
dialogo, [Link]() y [Link]() según el tipo
de acción que se quiera realizar con el fichero seleccionado ([Link]()).