Home | Clases | Interfaces de usuario con Java Swing | Eventos y componente JButton

Eventos y componente JButton


El modelo de eventos de Java

En Java, cada evento está representado por un objeto que es una subclase de la clase EventObject en el paquete java.util. Cada subclase de EventObject representa un tipo de evento particular. Por ejemplo:

  • MouseEvent, para representar acciones del ratón: mover, arrastrar, hacer clic en un botón del ratón, etc.
  • KeyEvent, para representar acciones del teclado, esto es, pulsar teclas.
  • ActionEvent, para representar un acción del usuario en la interfaz, por ejemplo, pulsar un botón en la pantalla.

No obstante, en el modelo de eventos de Java, los EventObject no realizan acciones por si mismos, sino que esos eventos son enviados a otro objeto encargado de responder a un tipo de evento en particular. Estos objetos son los que conocemos como listeners o "escuchadores", y existen diferentes listeners que "escuchan" a los diferentes eventos, tales como los mouse listeners, key listeners o action listeners.

Los listener no se implementan como clases en java, sino como interfaces. Un interface sería entonces una colección de métodos que definen un comportamiento en particular. De este modo, cualquier clase que suministre información para dichos métodos puede declarar que implementa a dicho interface.

La gran ventaja de implementar interfaces frente a heredar de otras clases es que una misma clase puede implementar varios interfaces simultáneamente pero solo puede heredar de una.

Los listeners que usaremos estarán en el paquete java.awt.event (que debemos importar antes de implementarlos) y nos podemos encontrar los siguientes:

Nombre: ActionListener
Descripción: Se produce al hacer click en un componente, también si se pulsa Enter teniendo el foco en el componente.
Método:
public void actionPerformed(ActionEvent e)
Eventos:
  • JButton: click o pulsar Enter con el foco activado en él.
  • JList: doble click en un elemento de la lista.
  • JMenuItem: selecciona una opción del menú.
  • JTextField: al pulsar Enter con el foco activado.

Nombre: KeyListener
Descripción: Se produce al pulsar una tecla. según el método cambiara la forma de pulsar la tecla.
Métodos:
public void keyTyped(KeyEvent e)
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
Eventos: Cuando pulsamos una tecla, según el listener:
  • keyTyped: al pulsar y soltar la tecla.
  • keyPressed : al pulsar la tecla.
  • keyReleased : al soltar la tecla.

Nombre: FocusListener
Descripción: Se produce cuando un componente gana o pierde el foco, es decir, que esta seleccionado.
Métodos: Recibir o perder el foco.

Nombre: MouseListener
Descripción: Se produce cuando realizamos una acción con el ratón.
Métodos:
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)
Eventos: Según el listener:
  • mouseClicked: pinchar y soltar.
  • mouseEntered: entrar en un componente con el puntero.
  • mouseExited: salir de un componente con el puntero
  • mousePressed: presionar el botón.
  • mouseReleased: soltar el botón.

Nombre: MouseMotionListener
Descripción: Se produce con el movimiento del mouse.
Métodos:
public void mouseDragged(MouseEvent e)
public void mouseMoved(MouseEvent e)
Eventos: Según el listener:
  • mouseDragged: click y arrastrar un componente.
  • mouseMoved: al mover el puntero sobre un elemento.


De esta forma, los listener se pueden invocar de esta manera:

import java.awt.event.*;

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


o de esta otra:

import java.awt.event.*;

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


JButton

El control JButton tiene como objetivo que el usuario pueda interactuar con él. La mecánica para atrapar el clic del objeto de la clase JButton se hace mediante la implementación de un ActionListener como acabamos de ver, más la declaración del método asociado a ese evento, en este caso actionPerformed.

Ejemplo 1: Confeccionar una ventana que muestre un botón. Cuando se presione finalizar la ejecución del programa Java.

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

public class Formulario extends JFrame implements ActionListener {

JButton boton1;
public Formulario() {
setLayout(null);
boton1=new JButton("Finalizar");
boton1.setBounds(300,250,100,30);
add(boton1);
boton1.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource()==boton1) {
System.exit(0);
}
}

public static void main(String[] args) {
Formulario formulario1=new Formulario();
formulario1.setBounds(0,0,450,350);
formulario1.setVisible(true);
}
}


Ejemplo 2: Confeccionar una ventana que contenga tres objetos de la clase JButton con las etiquetas "1", "2" y "3". Al presionarse cambiar el título del JFrame indicando qué botón se presionó.

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

public class Formulario extends JFrame implements ActionListener{

private JButton boton1,boton2,boton3;

public Formulario() {
setLayout(null);
boton1=new JButton("1");
boton1.setBounds(10,100,90,30);
add(boton1);
boton1.addActionListener(this);
boton2=new JButton("2");
boton2.setBounds(110,100,90,30);
add(boton2);
boton2.addActionListener(this);
boton3=new JButton("3");
boton3.setBounds(210,100,90,30);
add(boton3);
boton3.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource()==boton1) {
setTitle("boton 1");
}
if (e.getSource()==boton2) {
setTitle("boton 2");
}
if (e.getSource()==boton3) {
setTitle("boton 3");
}
}

public static void main(String[] args){
Formulario formulario1=new Formulario();
formulario1.setBounds(0,0,350,200);
formulario1.setVisible(true);
}
}


Ejemplo 3: Confeccionar una ventana que contenga tres objetos de la clase JButton con las etiquetas "Pulsa o teclea 1", "Pulsa o teclea 2" y "Pulsa o teclea 3" y un display de tipo JLabel. Al presionarse cualquiera de los botones o pulsar en el teclado 1, 2 o 3 debe cambiar el texto del JLabel con los números correspondientes. Además, al pasar por encima de cada botón debe cambiar el color de fondo del mismo. Por último, un cuarto botón con el texto "limpiar display" (o pulsar la letra "c") debe vaciar el texto del JLabel display.


package eventos;

import java.awt.Color;
import java.awt.Font;
import static java.awt.Font.PLAIN;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;


public class Eventos extends JFrame{

JLabel display;
JButton boton1, boton2, boton3, botonLimpiar;

public Eventos(){

//Declaro métodos en el constructor para simplificar el código
initDisplay();
initBotones();
initAcciones();
initHovers();
initPantalla(); //El JFrame lo último apra que me pinte correctamente los botones

}

private void initPantalla(){

setTitle("Eventos");
setSize(240,390);
setResizable(false);
setLayout(null);
getContentPane().setBackground(Color.BLACK);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

}

private void initDisplay(){

//Propiedades y estilos del JLabel
display = new JLabel("");
display.setBounds(15, 15, 195, 60);
display.setOpaque(true);
display.setBackground(Color.BLACK);
display.setForeground(Color.GREEN);
display.setBorder(new LineBorder(Color.DARK_GRAY));
display.setFont(new Font("MONOSPACED",PLAIN,24));
display.setHorizontalAlignment(SwingConstants.RIGHT);
display.setFocusable(true);
add(display);

//Eventos de entrada de teclado
display.addKeyListener(new KeyListener(){
@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
String ch = String.valueOf(e.getKeyChar());
if ("1".equals(ch) || "2".equals(ch) || "3".equals(ch)){
display.setText(display.getText() + ch);
}
if ("c".equals(ch)){
display.setText("");
}
}

@Override
public void keyReleased(KeyEvent e) {
}

});

}

//Propiedades y estilos de los JButton
private void initBotones(){

boton1 = new JButton("Pulsa o teclea 1");
boton2 = new JButton("Pulsa o teclea 2");
boton3 = new JButton("Pulsa o teclea 3");
botonLimpiar = new JButton("Limpiar display");

boton1.setBounds(15,90,195,50);
boton2.setBounds(15,155,195,50);
boton3.setBounds(15,220,195,50);
botonLimpiar.setBounds(15,285,195,50);

boton1.setFont(new Font("MONOSPACED",PLAIN,16));
boton2.setFont(new Font("MONOSPACED",PLAIN,16));
boton3.setFont(new Font("MONOSPACED",PLAIN,16));
botonLimpiar.setFont(new Font("MONOSPACED",PLAIN,16));

boton1.setOpaque(true);
boton2.setOpaque(true);
boton3.setOpaque(true);
botonLimpiar.setOpaque(true);

boton1.setFocusPainted(false);
boton1.setBackground(Color.DARK_GRAY);
boton1.setBorder(new LineBorder(Color.DARK_GRAY));
boton1.setForeground(Color.WHITE);

boton2.setFocusPainted(false);
boton2.setBackground(Color.DARK_GRAY);
boton2.setBorder(new LineBorder(Color.DARK_GRAY));
boton2.setForeground(Color.WHITE);

boton3.setFocusPainted(false);
boton3.setBackground(Color.DARK_GRAY);
boton3.setBorder(new LineBorder(Color.DARK_GRAY));
boton3.setForeground(Color.WHITE);

botonLimpiar.setFocusPainted(false);
botonLimpiar.setBackground(Color.DARK_GRAY);
botonLimpiar.setBorder(new LineBorder(Color.DARK_GRAY));
botonLimpiar.setForeground(Color.WHITE);

add(boton1);
add(boton2);
add(boton3);
add(botonLimpiar);

}

//Eventos de acción de botón
private void initAcciones(){

boton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText() + "1");
display.requestFocus(); //devuelvo foco a display para que funcione el KeyListener
}
});

boton2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText() + "2");
display.requestFocus();
}
});

boton3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText(display.getText() + "3");
display.requestFocus();
}
});

botonLimpiar.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
display.setText("");
display.requestFocus();
}
});


}

//Eventos de mouse
private void initHovers(){

boton1.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
boton1.setBackground(Color.GREEN);
boton1.setBorder(new LineBorder(Color.GREEN));
boton1.setForeground(Color.DARK_GRAY);
}

@Override
public void mouseExited(MouseEvent e) {
boton1.setBackground(Color.DARK_GRAY);
boton1.setBorder(new LineBorder(Color.DARK_GRAY));
boton1.setForeground(Color.WHITE);
}

});

boton2.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
boton2.setBackground(Color.GREEN);
boton2.setBorder(new LineBorder(Color.GREEN));
boton2.setForeground(Color.DARK_GRAY);
}

@Override
public void mouseExited(MouseEvent e) {
boton2.setBackground(Color.DARK_GRAY);
boton2.setBorder(new LineBorder(Color.DARK_GRAY));
boton2.setForeground(Color.WHITE);
}

});

boton3.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
boton3.setBackground(Color.GREEN);
boton3.setBorder(new LineBorder(Color.GREEN));
boton3.setForeground(Color.DARK_GRAY);
}

@Override
public void mouseExited(MouseEvent e) {
boton3.setBackground(Color.DARK_GRAY);
boton3.setBorder(new LineBorder(Color.DARK_GRAY));
boton3.setForeground(Color.WHITE);
}

});

botonLimpiar.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
}

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
botonLimpiar.setBackground(Color.GREEN);
botonLimpiar.setBorder(new LineBorder(Color.GREEN));
botonLimpiar.setForeground(Color.DARK_GRAY);
}

@Override
public void mouseExited(MouseEvent e) {
botonLimpiar.setBackground(Color.DARK_GRAY);
botonLimpiar.setBorder(new LineBorder(Color.DARK_GRAY));
botonLimpiar.setForeground(Color.WHITE);
}

});

}

public static void main(String[] args) {

new Eventos();

}

}


Fuentes: Eric S. Roberts. The Art & Science of Java
Fernando Ureña Gómez. discoduroderoer.es
Diego Moisset. tutorialesprogramacionya.com

Fecha de publicación: 18/09/2020
Asignaturas: desarrollo de interfaces
Temas: interfaces usuario usabilidad
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos