|
![]() |
Movimientos del Ratón |
Anterior | Siguiente |
En secciones anteriores ya se han presentado
los eventos del ratón y se indicó que hay dos interfaces diferentes para tratarlos: MouseListener
y MouseMotionListener. En el ejemplo que ilustrará esta sección, java1110.java, se verán solamente los métodos del interfaz MouseMotionListener: mouseDragged() y mouseMoved(), para mover un objeto Label sobre un objeto Panel, pinchando y arrastrando la Etiqueta. También se utilizarán los eventos mousePressed() y mouseReleased() del interfaz MouseListener. No se intenta hacer una demostración de la técnica de arrastrar-y-soltar; sino que solamente se pretende mostrar cómo instanciar, registrar, recibir y utilizar eventos declarados en el interfaz MouseMotionListener. El interfaz MouseMotionListener declara dos métodos: public abstract void mouseDragged( MouseEvent evt ) public abstract void mouseMoved( MouseEvent evt ) El primer método es invocado cuando uno de los botones del ratón es pulsado sobre un componente y luego arrastrado. Según la documentación, los eventos de arrastre del ratón continuarán siendo enviados al Componente donde se haya originado en primer lugar, hasta que el botón se suelte, considerando que la posición del ratón esté dentro de los límites del Componente. Sin embargo, si se inserta una sentencia println() en el ejemplo y se observa la salida, se puede comprobar que los eventos de arrastre dejan de generarse tan pronto como el ratón abandona los límites del objeto para el cual se ha registrado el receptor. Además, si el ratón vuelve a entrar dentro de los límites del objeto, no se recupera la emisión de eventos. Como este comportamiento no está claro, no sé si es un bug, un error en la documentación o simplemente una mala interpretación de la documentación por mi parte. El segundo método es invocado cuando el ratón se mueve sobre un Componente, sin ningún botón pulsado. Si también se coloca una llamada a println() en el método mouseMoved() del ejemplo, se puede observar que se generan eventos cuando el ratón se mueve dentro de la Etiqueta y dejan de generarse cuando el ratón abandona los límites de esa Etiqueta. El tren de eventos vuelve a producirse cuando el ratón reentra en el campo de acción de la Etiqueta. El programa ejemplo java1110.java, utiliza una combinación de eventos mousePressed(), mouseReleased() y mouseDragged() para implementar una forma muy cruda de la técnica de arrastrar-y-soltar. Se coloca una Etiqueta amarilla sobre un Panel que está situado sobre un Frame. Un objeto MouseListener y otro MouseMotionListener son instanciados y registrados para recibir eventos del ratón generados sobre el objeto Label. El usuario puede cambiar la posición del objeto Label pulsando el botón con el cursor dentro de la Etiqueta y arrastrándolo. El camino que siga el ratón debe comenzar y terminar dentro de los límites de la Etiqueta y no debe abandonar esos límites en ningún momento. La etiqueta se mueve la cantidad de pixels que resulte de la diferencia neta entre los puntos final e inicial de la posición del ratón. La posición inicial está determinada por las coordenadas del evento mousePressed() y el punto final está fijado por las coordenadas finales que envía el evento mouseDragged(). El propósito de este ejemplo es simplemente demostrar el uso del interfaz MouseMotionListener, en comparación con el interfaz MouseListener. No se ha pretendido que sea un programa que sirva de base para ejemplos de arrastrar-y-soltar. Hay una gran cantidad de código adicional que sería necesario incorporar a este programa para convertirlo en un verdadero ejemplo de este tipo de técnica, aunque resulta mucho más sencillo utilizar las clases incorporadas en el JDK 1.2 para estos menesteres. El programa produce una salida por pantalla que va mostrando el tren de eventos que está siendo generado por los métodos sobrecargados mouseDragged() y mouseMoved(). Si el lector observa detenidamente esa información mientras mueve o arrastra el ratón, tendrá una idea bastante clara de cómo está funcionando el sistema de eventos. |
|