Después de entender -al menos eso espero- cómo se pueden arrastrar gráficos con el ratón, vamos ahora a intentar arreglar un poco el código que dejamos hecho. En ese tutorial lo importante era entender cómo se podía arrastrar un gráfico y el código se hizo de forma directa y simple, pero desde luego no la mejor.
Aquí vamos a tratar de arreglar ese código, de forma que al final tengamos un Lienzo que podamos aprovechar en cualquier programa en el que queramos que se arrastren gráficos con el ratón. Trataremos también que sea fácil añadir nuevos gráficos arrastrables.
Al final tienes un jar y un zip de fuentes con el Lienzo y un par de figuras de ejemplo, para que puedas aprovecharlo en tus propios programas o para que juegues con él y hagas experimentos. Aquí tienes un Applet funcionando para que veas la pinta que tiene. Sólo tienes que arrastrar con el ratón las figuras que salen.
Para arrastrar un gráfico necesitamos, como comentamos en el tutorial anterior, varias cosas.
Todo este conocimiento está muy relacionado entre sí. Si hacemos una clase Figura, puede tener perfectamente todo esto. La clase Figura sabría como dibujarse. Podríamos pasarle la posición en la que queremos que se dibuje y puede decirnos si una determinada posición está o no dentro de ella.
Para poder tratar distintos tipos de figuras, incluso figuras futuras que alguien se invente, no estaría de más meter todas estas necesidades como métodos de una interface, de forma que todas las figuras que se hagan más adelante y pretendan ser arrastrables, deban obligatoriamente implementar esta interface.
La inteface sería InterfaceFigura.java, a la que hemos puesto métodos para que se dibuje en un Graphics, para pasarle una posición x,y en la que dibujarse y para que nos indique si una posición x,y está o no dentro de la figura. He puesto x,y y no MouseEvent porque una figura no tiene que saber nada del ratón. Si más adelante queremos utilizar la figura para otra cosa, será más fácil pasar un x,y que instanciar un MouseEvent ficticio.
Dentro del zip, al final del todo, tienes dos figuras que implementan esta interface. Un Rectangulo.java y una Circunferencia.java. Implementando correctamente la misma interface, puedes hacer todas las figuras que quieras y funcionarán.
El Lienzo no es más que una clase que hereda de Canvas. Le ponemos métodos para añadir figuras, es decir, un método addFigura() que admita como parámetro un InterfaceFigura. Las figuras que reciba en este método se las irá guardando en una lista.
En el Lienzo redefinimos también el método paint(), de forma que lo que hace es ir llamando a los dibujate() de todas las figuras que tiene en la lista, pasándoles su propio Graphics para que se dibujen en el Lienzo.
Finalmente, el mismo Lienzo añade un listener a los eventos de ratón, de forma que cuando comienza un arrastre, va preguntando a todas las figuras si el x,y del ratón cae encima de ella. La primera figura que conteste que sí es la que empezará a a ser arrastrada. El Lienzo se encarga de echar las cuentas del movimiento del ratón e indicarle a la figura dónde tiene que dibujarse.
Aquí tienes el fuente del LienzoParaArrastrarFiguras.java.
En arrastrar-graficos-1.0.jar tienes un jar con el lienzo, la interface y las dos figuras. Lleva un main de ejemplo y el applet que puedes ver arriba. Si quieres ejecutar el main de ejemplo, debes lanzarlo así
$ java -cp arrastar-graficos-1.0.jar chuidiang.ejemplos.arrastrar_grafico.MainEjemplo
En cuanto a los fuentes completos, los tienes en el zip arrastrar_graficos-1.0-src.zip.