Saltar al contenido principal

Componentes básicos de Swing

Los componentes son los elementos visuales interactivos de una interfaz: botones, campos de texto, etiquetas, etc.

Algunos de los componentes más comunes son:

  • JLabel: Mostrar texto o imágenes estáticas.
  • JButton: Botón clickable que dispara acciones.
  • JTextField: Entrada de texto de una sola línea.
  • JPasswordField: Entrada de contraseña (texto oculto).
  • JTextArea: Entrada de texto multilínea.
  • JCheckBox: Opción activable/desactivable.
  • JRadioButton: Opciones mutuamente excluyentes (en grupo).
  • JComboBox: Lista desplegable de opciones.
  • JSpinner: Control numérico o de fechas con flechas.
  • JSlider: Control deslizante de rango.
  • JProgressBar: Indicador de progreso de una tarea.

Métodos comunes a todos los componentes

Todos los componentes heredan de JComponent y comparten una serie de métodos comunes.

componente.setVisible(boolean);         // Mostrar u ocultar
componente.setEnabled(boolean); // Habilitar o deshabilitar
componente.setSize(int w, int h); // Tamaño en píxeles
componente.setPreferredSize(new Dimension(w, h)); // Tamaño preferido (recomendado)
componente.setBackground(Color.BLUE); // Color de fondo
componente.setForeground(Color.WHITE); // Color del texto/borde
componente.setFont(new Font("Arial", Font.BOLD, 14)); // Tipografía
componente.setToolTipText("Texto de ayuda"); // Tooltip al pasar el ratón
componente.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Borde

JLabel — Etiqueta

JLabel muestra texto o imágenes. No es interactivo.

// Solo texto
JLabel lblTexto = new JLabel("Nombre:");

// Texto con alineación horizontal
JLabel lblCentrado = new JLabel("Título", JLabel.CENTER); // LEFT, CENTER, RIGHT

// Texto e icono
ImageIcon icono = new ImageIcon("icono.png");
JLabel lblIcono = new JLabel("Guardar", icono, JLabel.LEFT);

// HTML en una etiqueta (muy útil para formato)
JLabel lblHtml = new JLabel("<html><b>Negrita</b> y <i>cursiva</i><br>Segunda línea</html>");

// Modificar después de crearlo
lblTexto.setText("Nuevo texto");
String texto = lblTexto.getText();

JButton — Botón

JButton es el componente más utilizado. Dispara eventos ActionEvent al ser pulsado.

JButton btnAceptar = new JButton("Aceptar");
JButton btnIcono = new JButton(new ImageIcon("check.png"));
JButton btnAmbos = new JButton("Guardar", new ImageIcon("save.png"));

// Configuración visual
btnAceptar.setMnemonic(KeyEvent.VK_A); // Alt+A activa el botón
btnAceptar.setActionCommand("aceptar"); // Identificador del comando

// Añadir listener (ver capítulo 4)
btnAceptar.addActionListener(e -> System.out.println("¡Pulsado!"));

// Desactivar
btnAceptar.setEnabled(false);

JTextField — Campo de texto de una línea

JTextField txtNombre = new JTextField();          // Vacío
JTextField txtCodigo = new JTextField(10); // Ancho aproximado de 10 caracteres
JTextField txtDefecto = new JTextField("Valor"); // Con texto inicial

// Leer y escribir
String valor = txtNombre.getText();
txtNombre.setText("Juan");

// Placeholder (texto gris de ayuda) — Swing no lo tiene nativo, solución manual:
txtNombre.setForeground(Color.GRAY);
txtNombre.setText("Introduce tu nombre...");
txtNombre.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
if (txtNombre.getText().equals("Introduce tu nombre...")) {
txtNombre.setText("");
txtNombre.setForeground(Color.BLACK);
}
}
public void focusLost(FocusEvent e) {
if (txtNombre.getText().isEmpty()) {
txtNombre.setForeground(Color.GRAY);
txtNombre.setText("Introduce tu nombre...");
}
}
});

// Solo lectura
txtNombre.setEditable(false);

// Alineación del texto
txtNombre.setHorizontalAlignment(JTextField.RIGHT);

// Detectar Enter
txtNombre.addActionListener(e -> System.out.println("Enter pulsado: " + txtNombre.getText()));

JPasswordField — Campo de contraseña

JPasswordField txtPass = new JPasswordField(20);
txtPass.setEchoChar('*'); // Carácter que se muestra al escribir

// IMPORTANTE: usar getPassword() en vez de getText() (más seguro)
char[] contrasena = txtPass.getPassword();
String passStr = new String(contrasena); // Convertir solo si es necesario

JTextArea — Área de texto multilínea

JTextArea areaTexto = new JTextArea(5, 30); // 5 filas, 30 columnas
areaTexto.setText("Texto inicial\nSegunda línea");
areaTexto.append("\nTexto añadido al final");
areaTexto.setLineWrap(true); // Ajuste de línea automático
areaTexto.setWrapStyleWord(true); // Ajustar por palabras, no por caracteres
areaTexto.setEditable(false); // Solo lectura

// Casi siempre se mete dentro de un JScrollPane para tener scroll
JScrollPane scroll = new JScrollPane(areaTexto);
scroll.setPreferredSize(new Dimension(400, 150));
panel.add(scroll);

JCheckBox — Casilla de verificación

JCheckBox chkAceptar = new JCheckBox("Acepto los términos");
JCheckBox chkMarcado = new JCheckBox("Recordarme", true); // Marcado por defecto

// Leer estado
boolean marcado = chkAceptar.isSelected();

// Cambiar estado
chkAceptar.setSelected(true);

// Detectar cambios
chkAceptar.addActionListener(e -> {
System.out.println("¿Marcado? " + chkAceptar.isSelected());
});
// O con ItemListener:
chkAceptar.addItemListener(e -> {
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("Activado");
} else {
System.out.println("Desactivado");
}
});

JRadioButton — Botón de opción (exclusivo)

Los JRadioButton se agrupan en un ButtonGroup para que solo uno esté activo a la vez.

JRadioButton rbHombre  = new JRadioButton("Hombre");
JRadioButton rbMujer = new JRadioButton("Mujer");
JRadioButton rbOtro = new JRadioButton("Otro", true); // Seleccionado por defecto

// OBLIGATORIO: agruparlos
ButtonGroup grupo = new ButtonGroup();
grupo.add(rbHombre);
grupo.add(rbMujer);
grupo.add(rbOtro);

// Añadirlos al panel (no el grupo, sino cada botón individualmente)
panel.add(rbHombre);
panel.add(rbMujer);
panel.add(rbOtro);

// Leer cuál está seleccionado
if (rbHombre.isSelected()) {
System.out.println("Seleccionado: Hombre");
}

// Obtener el seleccionado de un ButtonGroup
Enumeration<AbstractButton> botones = grupo.getElements();
while (botones.hasMoreElements()) {
AbstractButton btn = botones.nextElement();
if (btn.isSelected()) {
System.out.println("Seleccionado: " + btn.getText());
}
}

JComboBox — Lista desplegable

// Con array de Strings
String[] opciones = {"Rojo", "Verde", "Azul"};
JComboBox<String> combo = new JComboBox<>(opciones);

// Con genéricos y operaciones
combo.addItem("Amarillo");
combo.removeItem("Rojo");
combo.setSelectedIndex(0);
combo.setSelectedItem("Verde");

// Leer selección
String seleccion = (String) combo.getSelectedItem();
int indice = combo.getSelectedIndex();

// Editable (el usuario puede escribir su propio valor)
combo.setEditable(true);

// Listener
combo.addActionListener(e -> {
System.out.println("Elegido: " + combo.getSelectedItem());
});

JSpinner — Control numérico con flechas

// Spinner de enteros (min=0, max=100, paso=1, valor inicial=10)
SpinnerNumberModel modelo = new SpinnerNumberModel(10, 0, 100, 1);
JSpinner spinner = new JSpinner(modelo);

// Leer valor
int valor = (Integer) spinner.getValue();

// Spinner de fechas
SpinnerDateModel modeloFecha = new SpinnerDateModel();
JSpinner spinnerFecha = new JSpinner(modeloFecha);
spinnerFecha.setEditor(new JSpinner.DateEditor(spinnerFecha, "dd/MM/yyyy"));

JSlider — Control deslizante

// Horizontal, min=0, max=100, valor inicial=50
JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 50);
slider.setMajorTickSpacing(25);
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setSnapToTicks(true); // Encajar en marcas

// Leer valor
int val = slider.getValue();

// Listener
slider.addChangeListener(e -> {
System.out.println("Valor: " + slider.getValue());
});

JProgressBar — Barra de progreso

JProgressBar barra = new JProgressBar(0, 100);
barra.setValue(40); // 40%
barra.setStringPainted(true); // Mostrar "40%"
barra.setString("Cargando..."); // Texto personalizado

// Modo indeterminado (animación sin valor concreto)
barra.setIndeterminate(true);

Ejemplo completo

Creación de un formulario básico:

import javax.swing.*;
import java.awt.*;

public class FormularioBasico extends JFrame {

private JTextField txtNombre;
private JTextField txtEmail;
private JComboBox<String> cmbRol;
private JCheckBox chkActivo;
private JButton btnGuardar;
private JLabel lblResultado;

public FormularioBasico() {
super("Formulario de Usuario");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 280);
setLocationRelativeTo(null);
construirUI();
}

private void construirUI() {
JPanel panel = new JPanel(new GridLayout(6, 2, 8, 8));
panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));

panel.add(new JLabel("Nombre:"));
txtNombre = new JTextField();
panel.add(txtNombre);

panel.add(new JLabel("Email:"));
txtEmail = new JTextField();
panel.add(txtEmail);

panel.add(new JLabel("Rol:"));
cmbRol = new JComboBox<>(new String[]{"Admin", "Editor", "Lector"});
panel.add(cmbRol);

panel.add(new JLabel("Activo:"));
chkActivo = new JCheckBox();
panel.add(chkActivo);

btnGuardar = new JButton("Guardar");
btnGuardar.addActionListener(e -> guardar());
panel.add(new JLabel()); // celda vacía
panel.add(btnGuardar);

lblResultado = new JLabel(" ", JLabel.CENTER);
lblResultado.setForeground(Color.BLUE);
panel.add(lblResultado);

add(panel);
}

private void guardar() {
String nombre = txtNombre.getText().trim();
String email = txtEmail.getText().trim();
String rol = (String) cmbRol.getSelectedItem();
boolean activo = chkActivo.isSelected();

if (nombre.isEmpty() || email.isEmpty()) {
lblResultado.setForeground(Color.RED);
lblResultado.setText("Rellena todos los campos.");
return;
}
lblResultado.setForeground(new Color(0, 128, 0));
lblResultado.setText("Guardado: " + nombre + " (" + rol + ")");
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new FormularioBasico().setVisible(true));
}
}