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));
}
}