Hola a todos, hoy os explicare como usar los eventos y Listeners en Java, esto es muy importante en las aplicaciones gráficas.
Los eventos son las acciones que puede realizar el usuario, al realizar un evento se produce una serie de acciones. Por ejemplo, si el usuario pulsa un botón llamado «Salir» cerrara la aplicación. Otro ejemplo muy usado es para validar texto que introduzcamos en un campo de texto.
Los Listeners (oyentes o escuchadores en español) se encargan de controlar los eventos, esperan a que el evento se produzca y realiza una serie de acciones. Según el evento, necesitaremos un Listener que lo controle.
Cada Listener tiene una serie de métodos que debemos implementar obligatoriamente, aunque solo queramos usar uno solo de ellos.
Los Listeners que usaremos estarán en el paquete java.awt.event.
Vamos a ver los distintos Listeners que existen, la definición de sus métodos y los eventos que controlan:
public void actionPerformed(ActionEvent e) public void keyTyped(KeyEvent e) public void focusGained(FocusEvent e) public void mouseClicked(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mousePressed(MouseEvent e) public void mouseReleased(MouseEvent e) public void mouseDragged(MouseEvent e)
Nombre Listener Descripción Métodos Eventos
ActionListener Se produce al hacer click en un componente, también si se pulsa Enter teniendo el foco en el componente.
KeyListener Se produce al pulsar una tecla. según el método cambiara la forma de pulsar la tecla.
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)Cuando pulsamos una tecla, segun el Listener:
FocusListener Se produce cuando un componente gana o pierde el foco, es decir, que esta seleccionado.
public void focusLost(FocusEvent e)Recibir o perder el foco.
MouseListener Se produce cuando realizamos una acción con el ratón.
Según el Listener:
MouseMotionListener Se produce con el movimiento del mouse.
public void mouseMoved(MouseEvent e)Según el Listener:
Estos son los más comunes, otros eventos los veremos con más profundidad en posteriores posts
Para añadir un evento, seguiremos la siguiente sintaxis:
componente.add"tipo evento"(new "tipo evento"(){ metodos del evento });
Otra forma es:
"Tipo evento" "nombre"= new "tipo evento"{ metodos del evento }; componente.add"Tipo evento"("nombre");
Por ejemplo:
boton1.addActionListener(new ActionListener(){ public void actionPerformed (){ //Acciones } });
De la segunda manera seria así:
ActionListener al=new ActionListener(){ public void actionPerformed (){ //Acciones } }; boton1.addActionListener(al);
Es posible que algún que otro componente nos convenga que sea un atributo.
Os dejo un ejemplo completo con distintos tipos de eventos:
import java.awt.EventQueue; import javax.swing.*; import java.awt.event.*; public class EjemploEvento extends JFrame { private JPanel contentPane; private JTextField textField; private JTextField textField_1; private JTextField textField_2; private JComboBox<String> comboBox; private JRadioButton rdbtnOpcion; private JRadioButton rdbtnOpcion_1; private JRadioButton rdbtnOpcion_2; private JLabel lblEstasSobreLa; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { EjemploEvento frame = new EjemploEvento(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public EjemploEvento() { //Añade un titulo, no es estrictamente necesario setTitle("Titulo de la ventana"); /* * Coordenadas x y de la aplicacion y su altura y longitud, * si no lo indicamos aparecera una ventana muy pequeña */ setBounds(400, 200, 655, 520); /* * Indica que cuando se cierre la ventana se acaba la aplicacion, * si no lo indicamos cuando cerremos la ventana la aplicacion seguira funcionando */ setDefaultCloseOperation(EXIT_ON_CLOSE); //Hace visible la ventana, si no lo hacemos no veremos la aplicacion setVisible(true); //Creamos el panel contentPane =new JPanel(); //Indicamos su diseño contentPane.setLayout(null); //asigno el pannel a la ventana setContentPane(contentPane); //Componentes //Etiquetas JLabel lblEscribeElNombre = new JLabel("Escribe el nombre el nombre de una persona sin digitos"); lblEscribeElNombre.setBounds(369, 32, 229, 25); contentPane.add(lblEscribeElNombre); JLabel lblEligeUnaOpcin = new JLabel("Elige una opci\u00F3n:"); lblEligeUnaOpcin.setBounds(176, 32, 109, 14); contentPane.add(lblEligeUnaOpcin); JLabel lblPulsaElBoton = new JLabel("Pulsa el boton"); lblPulsaElBoton.setBounds(47, 32, 85, 14); contentPane.add(lblPulsaElBoton); lblEstasSobreLa = new JLabel("Estas sobre la "); lblEstasSobreLa.setBounds(158, 224, 192, 14); contentPane.add(lblEstasSobreLa); JLabel lblSoloSePuede = new JLabel("Solo se puede escribir digitos"); lblSoloSePuede.setBounds(371, 208, 193, 14); contentPane.add(lblSoloSePuede); JLabel lblNombreElegido = new JLabel("Nombre Elegido"); lblNombreElegido.setBounds(175, 124, 110, 14); contentPane.add(lblNombreElegido); //Campo de texto textField = new JTextField(); textField.setBounds(371, 68, 193, 26); contentPane.add(textField); textField_1 = new JTextField(); textField_1.setEditable(false); textField_1.setBounds(175, 150, 141, 20); contentPane.add(textField_1); textField_2 = new JTextField(); textField_2.setBounds(371, 247, 126, 20); contentPane.add(textField_2); //Botones JButton btnPulsame = new JButton("Pulsame"); btnPulsame.setBounds(43, 70, 89, 23); contentPane.add(btnPulsame); JButton btnAnadir= new JButton("A\u00F1adir"); btnAnadir.setBounds(371, 124, 89, 23); contentPane.add(btnAnadir); //Botones de radio rdbtnOpcion= new JRadioButton("Opcion 1"); rdbtnOpcion.setBounds(43, 194, 109, 23); contentPane.add(rdbtnOpcion); rdbtnOpcion_1 = new JRadioButton("Opcion 2"); rdbtnOpcion_1.setBounds(43, 220, 109, 23); contentPane.add(rdbtnOpcion_1); rdbtnOpcion_2 = new JRadioButton("Opcion 3"); rdbtnOpcion_2.setBounds(43, 246, 109, 23); contentPane.add(rdbtnOpcion_2); //Agrupamos los botnones de radio ButtonGroup bgroup = new ButtonGroup(); bgroup.add(rdbtnOpcion); bgroup.add(rdbtnOpcion_1); bgroup.add(rdbtnOpcion_2); //Menu de opciones comboBox = new JComboBox<>(); comboBox.setBounds(175, 70, 141, 22); contentPane.add(comboBox); //Añadimos opciones comboBox.addItem("Fernando"); comboBox.addItem("Alberto"); comboBox.addItem("Arturo"); //Eventos btnPulsame.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){ JOptionPane.showMessageDialog(contentPane, "¡Me has pulsado!"); } }); //En este caso hemos debido de converir el componente en un atributo comboBox.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){ textField_1.setText(comboBox.getItemAt(comboBox.getSelectedIndex())); } }); textField.addKeyListener(new KeyListener(){ public void keyTyped (KeyEvent e){ //Si el caracter introducido es un digito... if (Character.isDigit(e.getKeyChar())){ //... no lo escribe e.consume(); } } public void keyReleased(KeyEvent e){ } public void keyPressed(KeyEvent e){ } }); btnAnadir.addActionListener(new ActionListener(){ public void actionPerformed (ActionEvent e){ comboBox.addItem(textField.getText()); textField.setText(""); JOptionPane.showMessageDialog(contentPane, "Nombre Añadido"); } }); rdbtnOpcion.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion.getText()); } public void mouseExited(MouseEvent e){ lblEstasSobreLa.setText("Estas sobre la "); } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } }); rdbtnOpcion_1.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion_1.getText()); } public void mouseExited(MouseEvent e){ lblEstasSobreLa.setText("Estas sobre la "); } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } }); rdbtnOpcion_2.addMouseListener(new MouseListener(){ public void mouseClicked(MouseEvent e){ } public void mouseEntered(MouseEvent e){ lblEstasSobreLa.setText(lblEstasSobreLa.getText()+rdbtnOpcion_2.getText()); } public void mouseExited(MouseEvent e){ lblEstasSobreLa.setText("Estas sobre la "); } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } }); textField_2.addKeyListener(new KeyListener(){ public void keyTyped (KeyEvent e){ //Si el caracter introducido no es un digito... if (!Character.isDigit(e.getKeyChar())){ //... no lo escribe e.consume(); } } public void keyReleased(KeyEvent e){ } public void keyPressed(KeyEvent e){ } }); } }
Con netBeans, simplemente hacemos click derecho en un elemento (en la parte de diseño) y elegimos en el menú Eventos, el evento queremos programar y nos aparecera por separado en el código.
Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.
¡Gran post! ¡Enhorabuena!
Saludos… Gracias por compartir la publicación,…..
te escribo por una consulta… tengo un jinternal frame facturar que llama un jframe llamado pagar. Al hacer clic en este ultimo formulario en un boton finalizar, necesito retornar al de facturar y limpiar todo para que puedan hacer otra factura nueva.
Mi pregunta es la siguiente, debería usar un listener para poder activar y limpiar el formulario de facturar, y si es así, en donde podría llamar ese evento.. Este tema de los listener no he logrado comprender mucho como se usa y si necesito usarlo quisiera algo de orientación..
Si te es posible responder, agradeceré mucho.
Saludos.
pero si tengo que usar un addTableModel del abstarttablemodel como le hago
????
muy bueno pero tengo una duda necesito hacer q tras pulsar un boton se «muestre un panel o ventana pero antes necesito verificar una contrasenia en una ventana auxiliar y si es correcta pues activar una variable» una vez eso recien lanzo la ventana y cierro la ventana auxiliar de lo contrario no,
lo que verifico es si se marco o no en la ventana auxiliar, sucede q puede pasar mucho para que llene la ventana auxiliar para que se marque el «JcheckBox» y pues la accion del boton que acciona esto supongo que sigue activo para ver si lanza o no la otra ventana, espero se entienda :v
Excelente post, dos semanas he buscado información para tener un panorama claro sobre los Eventos en Java. Gracias por la colaboración.
Hola esta muy buena la información, gracias.
Y como le puedo hacer si quiero que al ingresar mediante un lector de código de barras el código de la tarjeta de una persona, el programa me busque automáticamente los datos relacionados a ese valor ingresado. lo que pasa es que yo lo tengo pero use un botón y de esta manera es muy lento el registro, les agradecería muchísimo si me pueden ayudar por favor.
Es para un proyecto de mi escuela.
orientado a objetos como seria?