Ejemplos java y C/linux

Tutoriales

Enlaces

Licencia

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.
Para reconocer la autoría debes poner el enlace https://old.chuidiang.org

Lienzo para arrastrar objetos gráficos

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.

Necesitas java 6

Los objetos gráficos

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

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.

Código completo

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.

Estadísticas y comentarios

Numero de visitas desde el 4 Feb 2007:

Aviso Legal