Sucesos (events) |
Dibujar un punto pulsando el botón izquierdo del ratón
canvas3:
CanvasApplet3.java, MiCanvas.java
Volvemos a estudiar el ejemplo en el que se dibujaban pequeños círculos al pulsar el botón izquierdo del ratón, y se guardaban en memoria en un array. Ahora se trata de dibujar los puntos no en el applet sino en un control canvas.
Crear el applet y establecer BorderLayout como gestor de diseño
Crear una clase MiCanvas derivada de Canvas
Crear un objeto canvas de la clase MiCanvas y situarlo en el centro (CENTER) de applet.
En modo diseño (pestaña Design), seleccionamos el objeto canvas en el panel de componentes y en el panel Events situado a la derecha hacemos doble-clic sobre el editor asociado a mousePressed. JBuilder genera el código tal como se ha explicado en las páginas anteriores, y de la forma que se indica en el listado
Como vemos, se asocia el control canvas, donde se van a producir los sucesos relacionados con el ratón, con un objeto de una clase anómina que deriva de la clase MouseAdapter y que redefine la función mousePressed.
La función respuesta canvas_mousePressed, llama a la función dibujaPunto miembro de la clase MiCanvas y le pasa las coordendas del punto de la superficie del canvas donde se ha pulsado el botón izquierdo del ratón. La abscisa x, y la ordenada y del punto están encapsuladas en un objeto de la clase Point.
public class CanvasApplet3 extends Applet {
MiCanvas canvas;
BorderLayout borderLayout1 = new BorderLayout();
public void init() {
canvas=new MiCanvas();
this.setLayout(borderLayout1);
this.add(canvas, BorderLayout.CENTER);
canvas.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
canvas_mousePressed(e);
}
});
}
void canvas_mousePressed(MouseEvent ev) {
canvas.dibujaPunto(ev.getPoint());
}
}
|
La definición de la clase que describe el canvas, MiCanvas es similar a la estudiada en ejemplos precedentes. El código de las funciones dibujaPunto y de la redefinición de paint, es similar al ejemplo estudiado dibujar los puntos y guardarlos en memoria.
Recordaremos que cuando el contexto gráfico g se obtiene mediante la función getGraphics es necesario liberar los recursos asociados a dicho contexto mediante llamada a la función dispose.
package canvas3;
import java.awt.*;
public class MiCanvas extends Canvas {
final int MAXPUNTOS=20;
Point puntos[]=new Point[MAXPUNTOS];
int nPuntos=0;
public MiCanvas() {
setBackground(Color.white);
}
void dibujaPunto(Point p){
Graphics g=getGraphics();
g.setColor(Color.red);
if(nPuntos<MAXPUNTOS){
puntos[nPuntos]=p;
nPuntos++;
}
g.fillOval(p.x-4, p.y-4, 8, 8);
g.dispose();
}
public void paint(Graphics g){
g.setColor(Color.blue);
for(int i=0; i<nPuntos; i++){
g.drawOval(puntos[i].x-4, puntos[i].y-4, 8, 8);
}
}
}
|
Como vimos ya en el ejemplo un simple programa de dibujo "a mano alzada", tenemos dos posibles aproximaciones para resolver este problema:
El mismo del ejemplo anterior
Se sugiere al lector que trate de resolver por sí mismo este ejercicio, tomando como base el estudio de los sucesos asociados al ratón
canvas4:
CanvasApplet4.java, MiCanvas.java
En el constructor de la clase MiCanvas asociamos mediante addMouseListener y addMouseMotionListener, el productor de los sucesos asociados al ratón, el canvas (this) con el objeto (this) de la clase que implementa los interfaces MouseListener y MouseMotionListener, y que maneja dichos sucesos definiendo las funciones declaradas en dichos interfaces.
El código de la clase MiCanvas, sería el siguiente
package canvas4;
import java.awt.*;
import java.awt.event.*;
public class MiCanvas extends Canvas implements
MouseListener, MouseMotionListener{
int uX, uY;
public MiCanvas() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
//interface MouseListener
public void mousePressed(MouseEvent ev) {
uX=ev.getX();
uY=ev.getY();
}
public void mouseExited(MouseEvent event) {}
public void mouseReleased(MouseEvent event) {}
public void mouseClicked(MouseEvent event) {}
public void mouseEntered(MouseEvent event) {}
//interface MouseMotionListener
public void mouseDragged(MouseEvent ev) {
int x = ev.getX();
int y = ev.getY();
Graphics g=getGraphics();
g.drawLine(uX, uY, x, y);
uX=x; uY=y;
g.dispose();
}
public void mouseMoved(MouseEvent event) {}
}
|
canvas5:
CanvasApplet5.java, MiCanvas.java
Definimos la clase MiCanvas derivada de Canvas, creamos un objeto canvas de dicha clase y lo situamos en el centro del applet. En modo diseño, seleccionamos el objeto canvas en el panel de componentes y en el panel Events situado a la derecha hacemos doble-clic sobre el editor asociado a mousePressed y mouseDragged. JBuilder genera el código tal como se ha explicado en las páginas anteriores.
Como vemos en el listado, se asocia el control canvas, donde se van a producir los sucesos relacionados con el ratón, con dos objetos de dos clases anóminas que derivan, respectivamente de las clases MouseAdapter y MouseMotionAdapter, y que redefine las funciones mousePressed y mouseDragged.
public class CanvasApplet5 extends Applet {
MiCanvas canvas;
BorderLayout borderLayout1 = new BorderLayout();
public void init() {
canvas=new MiCanvas();
this.setLayout(borderLayout1);
this.add(canvas, BorderLayout.CENTER);
canvas.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
canvas_mousePressed(e);
}
});
canvas.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
canvas_mouseDragged(e);
}
});
}
void canvas_mouseDragged(MouseEvent e) {
canvas.dibujaCurva(e.getX(), e.getY());
}
void canvas_mousePressed(MouseEvent e) {
canvas.puntoInicial(e.getX(), e.getY());
}
}
|
Desde la función respuesta canvas_mousePressed se llama a la función miembro puntoInicial de la clase que describe el canvas, MiCanvas, y le pasa las coordendas del punto del canvas donde se ha pulsado el botón iquierdo del ratón.
Desde la función respuesta canvas_mouseDragged se llama a la función miembro dibujaCurva de la clase que describe el canvas, MiCanvas, y le pasa las coordendas del punto del canvas donde está situado el puntero del ratón a medida que se va arrastrando.
La definición de la clase MiCanvas, es la siguiente
package canvas5;
import java.awt.*;
public class MiCanvas extends Canvas{
int uX, uY;
public MiCanvas() {
}
public void puntoInicial(int x, int y) {
uX=x;
uY=y;
}
public void dibujaCurva(int x, int y) {
Graphics g=getGraphics();
g.drawLine(uX, uY, x, y);
uX=x; uY=y;
g.dispose();
}
}
|