Tutorial de Java Swing: Construyendo aplicaciones GUI robustas
¿Qué es Swing en Java?
Java Swing es un toolkit GUI sofisticado e independiente de plataforma que extiende el Abstract Window Toolkit (AWT). Ofrece un rico conjunto de widgets —botones, tablas, árboles y más— permitiendo a los desarrolladores crear aplicaciones de escritorio pulidas sin reinventar componentes básicos.
Como parte de las Java Foundation Classes (JFC), Swing se basa en la funcionalidad central de AWT mientras proporciona componentes ligeros y personalizables. El resultado es un framework que soporta características avanzadas de UI, como cambios de look-and-feel, pintura personalizada y enlace de datos.
En este tutorial dominarás:
- Qué es Swing y por qué importa
- Clases contenedoras y sus roles
- Conceptos fundamentales de desarrollo GUI en Java
- Creación de GUI paso a paso con ejemplos prácticos
- Gestores de layout comunes y sus casos de uso
- BorderLayout, FlowLayout y GridBagLayout en profundidad
Diagrama de jerarquía de clases de Java Swing
Todos los componentes Swing heredan de JComponent y pueden añadirse a clases contenedoras.
¿Qué es una clase contenedora (Container Class)?
Las clases contenedoras son la columna vertebral de cualquier UI Swing — contienen y organizan otros componentes. Como mínimo, una aplicación Swing requiere un contenedor. Hay tres tipos principales de contenedores:
- JPanel – Un contenedor ligero, no ventana, usado para agrupar componentes.
- JFrame – Una ventana de nivel superior que incluye barra de título, bordes y menú del sistema.
- JDialog – Una ventana emergente modal o no modal para solicitudes al usuario.
¿Qué es GUI en Java?
Cómo construir una GUI en Java (Paso a paso)
A continuación se muestra un recorrido práctico que ilustra cómo construir una ventana básica y añadir componentes progresivamente.
Paso 1 – Crear un nuevo archivo Java
Copia el siguiente código en tu editor:
import javax.swing.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Mi Primera GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
JButton boton = new JButton("Pulsar");
frame.getContentPane().add(boton);
frame.setVisible(true);
}
}
Paso 2 – Compilar y Ejecutar
Guarda el archivo, compila con javac GuiDemo.java, luego ejecuta con java GuiDemo. Debería aparecer una ventana de 300 × 300 con un solo botón.
Paso 3 – Añadir otro botón
Modifica el código para incluir un segundo botón:
import javax.swing.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Mi Primera GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
JButton boton1 = new JButton("Botón 1");
JButton boton2 = new JButton("Botón 2");
frame.getContentPane().add(boton1);
frame.getContentPane().add(boton2);
frame.setVisible(true);
}
}
Paso 4 – Observar el problema de layout
Ejecutar el código ahora muestra dos botones superpuestos porque el gestor de layout por defecto para JFrame es BorderLayout, que coloca componentes en cinco regiones distintas. Sin especificar una región, los componentes subsiguientes reemplazan a los anteriores.
Gestores de Layout (Layout Managers) en Java
Los gestores de layout controlan cómo se organizan los componentes dentro de los contenedores. Elegir el gestor adecuado es crítico para GUIs responsivas y mantenibles. Los más usados son:
- BorderLayout
- FlowLayout
- GridBagLayout
- BoxLayout (no cubierto aquí)
BorderLayout
BorderLayout divide un contenedor en cinco áreas: NORTH, SOUTH, EAST, WEST y CENTER. Es el gestor por defecto para JFrame.
FlowLayout
FlowLayout organiza componentes secuencialmente en una fila, saltando a la siguiente línea según sea necesario. Es el gestor por defecto para JPanel.
GridBagLayout
GridBagLayout ofrece la mayor flexibilidad, permitiendo que los componentes ocupen múltiples filas o columnas y se alineen precisamente dentro de una cuadrícula.
Ejemplo: Construyendo una ventana de chat simple
A continuación se muestra un programa completo que demuestra cómo combinar menús, un área de texto y un panel de control en una interfaz de chat cohesiva.
Intenta codificarlo tú mismo antes de revisar la solución.
// Aplicación Swing completa que incluye menús, área de texto y controles
import javax.swing.*;
import java.awt.*;
class GuiDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Chat Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 400);
// Barra de menú
JMenuBar menuBar = new JMenuBar();
JMenu menuArchivo = new JMenu("ARCHIVO");
JMenu menuAyuda = new JMenu("Ayuda");
menuBar.add(menuArchivo);
menuBar.add(menuAyuda);
JMenuItem itemAbrir = new JMenuItem("Abrir");
JMenuItem itemGuardar = new JMenuItem("Guardar como");
menuArchivo.add(itemAbrir);
menuArchivo.add(itemGuardar);
// Panel inferior con FlowLayout (por defecto)
JPanel panel = new JPanel();
panel.add(new JLabel("Introducir Texto"));
panel.add(new JTextField(10));
panel.add(new JButton("Enviar"));
panel.add(new JButton("Reiniciar"));
// Área de texto en el centro
JTextArea areaTexto = new JTextArea();
// Añadir componentes al frame usando BorderLayout
frame.getContentPane().add(BorderLayout.SOUTH, panel);
frame.getContentPane().add(BorderLayout.NORTH, menuBar);
frame.getContentPane().add(BorderLayout.CENTER, areaTexto);
frame.setVisible(true);
}
}
Java
- Desarrollar una aplicación de consola PLCnext usando C#: Guía para principiantes
- Optimiza aplicaciones Java 9 en PLCnext Control usando Jlink
- Despliegue de aplicaciones Java EE en Microsoft Azure: guía paso a paso
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Tutorial de arrays en Java: Declaración, creación e inicialización – Código de ejemplo
- Crear un array de objetos en Java: Guía paso a paso
- Generar números aleatorios en Java: Guía práctica con Random y Math.random
- Lectura de archivos en Java con BufferedReader – Guía práctica con ejemplos
- Convertir Char a String en Java – Ejemplos Prácticos y Mejores Prácticas
- Invertir una Cadena en Java Usando Recursión – Guía Paso a Paso
- Java 10: Mejorar Rendimiento con Compartición de Datos de Clase de Aplicación (CDS)