Esdeveniments i listeners en Java

Hola a tots, avui us explicaré com utilitzar els esdeveniments i listeners en Java, això és molt important en les aplicacions gràfiques.

Els esdeveniments són les accions que pot realitzar l’usuari, a l’realitzar un esdeveniment es produeix una sèrie d’accions. Per exemple, si l’usuari prem un botó anomenat “Sortir” tanqués l’aplicació. Un altre exemple molt usat és per validar text que introduïm en un camp de text.

Els listeners (oients o escoltadors en espanyol) es s’encarreguen de controlar els esdeveniments, esperen a que l’esdeveniment es produeixi i realitza una sèrie d’accions. Segons l’esdeveniment, necessitarem un Listener que ho controli.

Cada Listener té una sèrie de mètodes que hem d’implementar obligatòriament, encara que només vulguem fer servir un sol d’ells.

els listeners que farem servir seran al paquet java.awt.event.

Anem a veure els diferents listeners que existeixen, la definició de les seves mètodes i els esdeveniments que controlen:

Nom Listener Descripció Mètodes Esdeveniments
ActionListener Es produeix a l’fer clic en un component, també si es prem Enter tenint el focus en el component.

public void actionPerformed (ActionEvent e)

    a

  • JButton: clic o prémer Enter amb el focus activat en ell.
  • a

  • JList: doble clic en un element de la llista.
  • a

  • JMenuItem: selecciona una opció de menú.
  • a

  • JTextField: a l’prémer Enter amb el focus activat.
KeyListener es produeix a l’prémer una tecla. segons el mètode canviés la forma de prémer la tecla.

public void keyTyped (KeyEvent i) a public void keyPressed (KeyEvent i) a public void keyReleased (KeyEvent i )

Quan premem una tecla, segons el Listener: amor

    a

  • keyTyped: a l’prémer i deixar anar la tecla.
  • a

  • keyPressed: a l’prémer la tecla.
  • a

  • keyReleased: a l’deixar anar la tecla.
  • a

FocusListener Es produeix quan un component guanya o perd el focus, és a dir, que aquesta seleccionat .

public void focusGained (FocusEvent i) a public void focusLost (FocusEvent e)

Rebre o perdre el focus.
MouseListener Es produeix quan vam realitzar una acció amb el ratolí.

public void mouseClicked (MouseEvent e)

public void mouseEntered (MouseEvent e)

a

public void mouseExited (MouseEvent e)

a

public void mousePressed (MouseEvent e)

public void mouseReleased (MouseEvent e)

Segons el Listener: amor

    a

  • mouseCliked: punxar i deixar anar.
  • mouseEntered: entrar en un component amb el punter.
  • a

  • mouseExited: sortir d’un component amb el punter
  • a

  • mousePressed: prémer el botó.
  • a

  • mouseReleased: deixar anar el botó.
  • a

MouseMotionListener Es produeix amb el moviment de l’ratolí.

public void mouseDragged (MouseEvent e)
public void mouseMoved (MouseEvent e)

Segons el Listener:

    a

  • mouseDragged: clic i arrossegar un component.
  • a

  • mouseMoved: a l’moure el punter sobre un element
  • a

Aquests són els més comuns, altres esdeveniments els veurem amb més profunditat en posteriors posts

Per afegir un esdeveniment, seguirem la següent sintaxi:

componente.add"tipo evento"(new "tipo evento"(){ metodos del evento});

Una altra forma és:

"Tipo evento" "nombre"= new "tipo evento"{ metodos del evento};componente.add"Tipo evento"("nombre");

Per exemple:

boton1.addActionListener(new ActionListener(){ public void actionPerformed (){ //Acciones }});

De la segona manera seriosa així:

ActionListener al=new ActionListener(){ public void actionPerformed (){ //Acciones }};boton1.addActionListener(al);

És possible que algun que altre component ens convingui que sigui un atribut.

Us deixo un exemple complet amb diferents tipus d’esdeveniments:

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 necesariosetTitle("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 aplicacionsetVisible(true);//Creamos el panelcontentPane =new JPanel();//Indicamos su diseñocontentPane.setLayout(null);//asigno el pannel a la ventanasetContentPane(contentPane);//Componentes//EtiquetasJLabel 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 textotextField = 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);//BotonesJButton 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 radiordbtnOpcion= 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 radioButtonGroup bgroup = new ButtonGroup();bgroup.add(rdbtnOpcion);bgroup.add(rdbtnOpcion_1);bgroup.add(rdbtnOpcion_2);//Menu de opcionescomboBox = new JComboBox<>();comboBox.setBounds(175, 70, 141, 22);contentPane.add(comboBox);//Añadimos opcionescomboBox.addItem("Fernando");comboBox.addItem("Alberto");comboBox.addItem("Arturo");//EventosbtnPulsame.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 atributocomboBox.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 escribee.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 escribee.consume();}}public void keyReleased(KeyEvent e){}public void keyPressed(KeyEvent e){}});}}

Amb Netbeans, simplement fem clic dret en un element (a la part de disseny) i triem al menú Esdeveniments, l’esdeveniment volem programar i ens apareixerà per separat en el codi.
Espero que us sigui d’ajuda. Si teniu dubtes, pregunteu. Estem per ajudar-te.

Leave a Comment

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *