Crear eventos de ratón puede tener grandes utilidades, mas aun cuando se trata de desarrollar algún videojuego. Pues, permite crear diferentes funciones de acuerdo al comportamiento especifico del usuario tras utilizar el mouse.

El manejo de eventos de mouse se implementa mediante dos formas diferentes, la primera es utilizando clases de interfaz. Otra opción es utilizando las clases adaptadoras.

Los eventos de mouse son varios, afortunadamente he preparado un ejemplo que permitirá comprender de manera sencilla el funcionamiento de cada método. Para ello, primero mencionaremos los métodos a continuación:

Métodos pertenecientes a la interfaz MouseListener o clase MouseAdapter

mouseClicked: Se activa cuando se presiona y dejas de presionar el botón, sin mover el mouse. Por lo que, si mantienes presionado, mueves el mouse y sueltas el botón se activara otro método nombrado mouseDragged.

mouseEntered: Cuando se encuentra dentro del área de un componente, este método se invoca. Por ejemplo: tenemos un panel al cual agregamos este tipo de evento, este método me permite saber cuando se encuentra el cursor dentro del panel (componente).

mouseExited: Se lanza cuando el cursor sale del área de un componente, retomando el ejemplo del panel del método anterior. Funciona de manera contraria, pues el método se activa cuando el cursor esta dentro del panel y este sale del área conformada por el componente.

mousePressed: Se activa cuando el botón del mouse se mantiene presionado.

mouseReleased: Cuando el botón del mouse deja de ser presionado, se invoca el método.

Métodos pertenecientes a la interfaz MouseMotionListener o clase MouseMotionAdapter

mouseDragged: Cuando mantienes presionado el botón del mouse y lo mueves, se activa el método.

mouseMoved: Este método se invoca cuando el cursor (mouse) se mueve.

Ejemplo para el Manejo de Eventos de Mouse

Los temas nuevos, se entienden mejor con un ejemplo. Las funciones del ejemplo son:

Cuando se mantiene presionado el botón del mouse, el fondo cambia de color. Esto es gracias al metodo mousePressed, pues se invoca al realizar este comportamiento.

Y si al mismo tiempo se arrastra el cursor se dibujara un circulo que lo siga. Cabe mencionar que esto es posible gracias a que el metodo mouseDragged que es invocado.

Ademas, si usted presiona y deja de presionar sin mover el cursor se dibuja un rectángulo alrededor del circulo en las coordenadas donde se presiono. Y ahora podra apreciar una apariencia distinta como se ve a continuación:

Si usted deja de presionar el botón del mouse, el color de fondo es eliminado. Estos son los comportamientos mas destacados, los demás solo imprimen mensajes en consola.

Como es costumbre, comencemos creando nuestro marco (JFrame) con las instancias necesarias:

package eventomouse;

import javax.swing.JFrame;

public class EventoRaton {

    public static void main(String[] args) {
        JFrame f = new JFrame("Eventos de Mouse");
        PanelRaton panel = new PanelRaton();
        OyenteRaton oyente = new OyenteRaton(panel);
        panel.addEventos(oyente);
        f.add(panel);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.setBounds(300, 200, 500, 400);
    }
    
}

Ahora creamos el panel, este componente nos permite dibujar dentro y agregar mas componentes. Dentro de este, realizare los métodos necesarios para dibujar de acuerdo al comportamiento del usuario con el mouse.

package eventomouse;

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

public class PanelRaton extends JPanel {

    private int x = 0;
    private int y = 0;
    private boolean band = false;

    public void addEventos(OyenteRaton e) {
        this.addMouseListener(e);
        this.addMouseMotionListener(e);
    }

    public void setCoordenadas(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public void setBandera(boolean band) {
        this.band = band;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.translate(x, y);
        g.fillOval(-10, -10, 20, 20);
        if(band) {
            g.setColor(Color.red);
            g.drawRect(-25, -20, 50, 40);
//            band = false;
        }
    }

}

Hasta ahora hemos creado nuestra ventana y panel. El paso final es crear nuestro OyenteRaton, dentro de esta clase agregare todos los métodos necesarios para implementar este tipo de evento. Ademas, me tome la molestia de escribir una pequeña descripción en cada método indicando el comportamiento.

package eventomouse;

import java.awt.Color;
import java.awt.event.*;

public class OyenteRaton implements MouseListener, MouseMotionListener {
    
    private PanelRaton panel;
    
    public OyenteRaton(PanelRaton panel) {
        this.panel = panel;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        //se invoca cuando presionas y dejas de presionar el boton sin mover el cursor.
        panel.setCoordenadas(e.getX(), e.getY());
        panel.setBandera(true);//se activa la bandera, permitiendo dibujar un rectangulo, puede ver la clase PanelRaton.
    }

    @Override
    public void mousePressed(MouseEvent e) {
        //se llama cuando se mantiene presionado el boton.
        panel.setBackground(Color.CYAN);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        //se llama cuando has dejado de presionar el boton del mouse.
        panel.setBackground(null);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        //se llama cuando el mouse entra a los limites del componente.
        //Cuando sale y entra de la ventana (en este caso).
        System.out.println("Acabas de entrar al area del componente");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        //se llama cuando el cursor sale de los limites del componente.
        System.out.println("Acabas de salir del area del componente");
    }

    //Los siguientes metodos pertenecen a MouseMotionListener
    @Override
    public void mouseDragged(MouseEvent e) {
        //es llamado cuando mantienes presionado el boton y mueves el cursor.
        panel.setCoordenadas(e.getX(), e.getY());
        panel.repaint();
    }
    
    @Override
    public void mouseMoved(MouseEvent e) {
        //Se llama al moveerse el cursor.
        /*recomiendo comentar la siguiente linea, para apreciar mejor el mensaje de mouseEntered y mouseExited*/
//        System.out.println("estas moviendo el cursor");
    }
    
}