lunes, mayo 05, 2008

Eventos de ratón en Java

El objetivo de este ejemplo es que tengamos control sobre las acciones de nuestro ratón: si entra en nuestra ventana, si sale, si se pulsa uno de sus botones o si se suelta, además de saber que botón se ha pulsado y en que parte de la ventana se ha hecho.

El ejemplo es sencillo. He creado una clase, Ventana, que deriva de la clase Frame y que implementa la interfaz MouseListener.

static public class Ventana extends Frame implements MouseListener{


Al implementar la clase MouseListener, nos vemos obligados a implementar los siguientes métodos:

public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}


Y para que estos eventos funcionen para nuestra ventana, hay que sobrecargar el constructor de Ventana (que no olvidemos que tiene uno por defecto, el de Frame), para añadirle nuestro propio Listener.

public Ventana(){
     addMouseListener(this); // añado el listener (sin esto, no hay reacción)
}


Para que el ejemplo sea más comprensible, muestro las acciones del ratón mediante mensajes por consola y además, añadiendo dos métodos más: uno para obtener la posición del cursor(dentro de nuestra ventana) y otra para saber el botón que se ha pulsado.

//Construye una String con la posicion del cursor
public String getPosicion(MouseEvent e) {
     String pos="[ Posicion x="+e.getPoint().getX();
     pos=pos+" ; y="+e.getPoint().getY()+ " ]";
     return pos;
}

//Construyo un mensaje para indicar que botón se está pulsando
public String getBoton(MouseEvent e){
     String msg=null;
     int result=e.getButton();
     if (result==e.NOBUTTON)
          msg=" - No pulsó ningún botón -";
     else if (result==e.BUTTON1)
         msg=" - Pulsó el botón nº 1 - ";
     else if (result==e.BUTTON2)
         msg=" - Pulsó el botón nº 2 - ";
     else if (result==e.BUTTON3)
         msg=" - Pulsó el botón nº 3 - ";

     return msg;
}


Para terminar con el ejemplo, sólo hace falta crearnos desde el main de nuestro pequeño programa nuestra ventana, visualizarla y probarla:

public static void main(String str[]){

     Frame miVentana = new Ventana();
     int w = 300;
     int h = 300; 
     miVentana.setSize(w, h);
     miVentana.setVisible(true);
}


Aquí, un ejemplo de salida por consola:

Entrando en la ventana - No pulsó ningún botón -[ Posicion x=295.0 ; y=294.0 ]
Apretando botón ratón - Pulsó el botón nº 1 - [ Posicion x=133.0 ; y=145.0 ]
Soltando botón ratón - Pulsó el botón nº 1 - [ Posicion x=133.0 ; y=145.0 ]
Haciendo click botón ratón - Pulsó el botón nº 1 - [ Posicion x=133.0 ; y=145.0 ]
Apretando botón ratón - Pulsó el botón nº 1 - [ Posicion x=133.0 ; y=145.0 ]
Soltando botón ratón - Pulsó el botón nº 1 - [ Posicion x=178.0 ; y=93.0 ]
Saliendo de la ventana - No pulsó ningún botón -[ Posicion x=297.0 ; y=121.0 ]


Este ejemplo esta tomado de How to Write a Mouse Listener, donde hay una mayor documentación sobre otras funciones, como obtener el instante que ha ocurrido el evento(Long getWhen(), interpretado como un TimeStamp) o obtener las máscaras (si se ha pulsado la tecla Ctrl, Alt, Mays, o una combinación entre ellas, usando int getModifiers() ).

También hay otros ejemplo en La programación del ratón, donde se implementa un applet para dibujar con el ratón.

El código completo del ejemplo(listo para compilar) lo puedes encontrar aquí.

4 comentarios:

jeison dijo...

wow! simple y concreto, gracias.

Unknown dijo...

*Como puedo saber si el mouse hizo click FUERA DE LA VENTANA?
*Esto funciona con este codigo?
Gracias.

Emilio dijo...

Hola Hans!

el problema es que estos eventos son útiles para saber que ocurre en nuestra ventana, pero no fuera de ella.

Me ha parecido interesante tu pregunta, y lo he estado mirando, aunque no lo he probado. Quizás este enlace te pueda servir de ayuda:

http://alvinalexander.com/java/java-xeyes-mouse-cursor-location-position

La solución que plantea el autor es usar las clases MouseInfo, Point y PointerInfo del package java.awt.*


Un saludo

Jose Peña dijo...

hola

megustaria ver el codigo completo soy nuevo y algunas cosas no las entiendo si me pueden ayudar.

Realmente pretendo enterder la estructura del algoritmo para darme una idea de cual seria la estructura sintactica.

Saludos cordiales