Interfaces Tema 3
Eventos
Un evento es algo que hace el usuario: pulsar un botón, escribir, marcar una casilla, mover un deslizador… Un programa con ventanas no hace nada por sí solo: espera, y cuando llega un evento, ejecuta el código que le hayas preparado para él.
Reaccionar a un botón#
Para decirle a un botón qué hacer al pulsarlo se usa addActionListener:
boton.addActionListener(e -> {
// lo que pasa cada vez que se pulsa el botón
});La flecha -> se lee «cuando pase, haz esto». Lo que va entre las llaves no se ejecuta ahora, sino cada vez que se pulse el botón. (Ese trozo de código se llama lambda, y la e trae información del evento, que de momento no necesitamos.)
Un contador de clics:
import javax.swing.*;
import com.formdev.flatlaf.FlatLightLaf;
public class Contador {
static int clics = 0;
public static void main(String[] args) {
FlatLightLaf.setup();
SwingUtilities.invokeLater(() -> {
JFrame ventana = new JFrame("Contador");
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JButton boton = new JButton("Púlsame");
JLabel etiqueta = new JLabel("Has pulsado 0 veces");
panel.add(boton);
panel.add(etiqueta);
boton.addActionListener(e -> {
clics++;
etiqueta.setText("Has pulsado " + clics + " veces");
});
ventana.add(panel);
ventana.setSize(360, 120);
ventana.setLocationRelativeTo(null);
ventana.setVisible(true);
});
}
}
Nota
clics está fuera del main, como static int clics. Dentro de una lambda no se puede cambiar una variable local del main: Java da un error (lo tienes en la tabla del final).
Leer lo que ha escrito el usuario#
Lo normal es que el botón use lo que hay en otros componentes. Aquí, el saludo lee el campo de texto, y si está vacío avisa con una ventanita (JOptionPane):
import javax.swing.*;
import com.formdev.flatlaf.FlatLightLaf;
public class Saludo {
public static void main(String[] args) {
FlatLightLaf.setup();
SwingUtilities.invokeLater(() -> {
JFrame ventana = new JFrame("Saludo");
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
JTextField nombre = new JTextField(12);
JButton boton = new JButton("Saludar");
JLabel respuesta = new JLabel(" ");
panel.add(new JLabel("¿Cómo te llamas?"));
panel.add(nombre);
panel.add(boton);
panel.add(respuesta);
boton.addActionListener(e -> {
String texto = nombre.getText().trim();
if (texto.isEmpty()) {
JOptionPane.showMessageDialog(ventana, "Escribe tu nombre primero");
} else {
respuesta.setText("¡Hola, " + texto + "!");
}
});
ventana.add(panel);
ventana.setSize(520, 120);
ventana.setLocationRelativeTo(null);
ventana.setVisible(true);
});
}
}
Si se pulsa sin escribir nada:

Ventanitas con JOptionPane#
| Para… | Código | Devuelve |
|---|---|---|
| Avisar | JOptionPane.showMessageDialog(ventana, "Guardado"); | Nada |
| Preguntar sí o no | JOptionPane.showConfirmDialog(ventana, "¿Borrar?") | JOptionPane.YES_OPTION si dice que sí |
| Pedir un texto | JOptionPane.showInputDialog(ventana, "¿Tu nombre?") | El texto, o null si cancela |
int respuesta = JOptionPane.showConfirmDialog(ventana, "¿Seguro que quieres borrarlo?");
if (respuesta == JOptionPane.YES_OPTION) {
// borrar
}Otros eventos#
| Componente | Cuándo salta | Cómo se escucha |
|---|---|---|
JButton | Al pulsarlo | addActionListener |
JTextField | Al pulsar Enter dentro | addActionListener |
JCheckBox, JRadioButton | Al marcar o desmarcar | addActionListener |
JComboBox | Al elegir otra opción | addActionListener |
JSlider, JSpinner | Al cambiar el valor | addChangeListener(e -> { … }) |
Errores frecuentes#
| Mensaje o síntoma | Qué significa | Cómo se arregla |
|---|---|---|
local variables referenced from a lambda expression must be final or effectively final | Intentas cambiar dentro de la lambda una variable creada en el main | Sácala fuera del main, como static int clics = 0; |
| Pulsas el botón y no pasa nada | No tiene addActionListener, o se lo has puesto a otro botón | Comprueba que el addActionListener es del botón que pulsas |
NumberFormatException al pulsar | Haces Integer.parseInt de un campo vacío o con letras | Comprueba antes que no está vacío, y avisa con un JOptionPane |
Exception in thread "AWT-EventQueue-0" en la consola, y la ventana sigue abierta | Ha fallado el código de un evento. AWT-EventQueue-0 es el hilo de Swing | Lee la línea de debajo: dice qué error ha sido y en qué línea |