/*
* Fichero: ArrastrarGrafico.java
* Autor: Chuidiang
* Fecha: 6/06/07 21:40
*/
package chuidiang.ejemplos.arrastrar_grafico;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.LinkedList;
/**
* Ejemplo de gráfico que se puede arrastrar con el ratón.
*
* @author Chuidiang
*
*/
public class LienzoParaArrastrarFiguras extends Canvas implements MouseMotionListener
{
/**
* serial uid
*/
private static final long serialVersionUID = -4273648398171436938L;
/**
* Lista de figuras a dibujar.
*/
private LinkedList<InterfaceFigura> listaFiguras = new LinkedList<InterfaceFigura>();
/**
* Si actualmente se está arrastrando o no el rectángulo.
*/
private InterfaceFigura figuraArrastrandose = null;
/**
* x en la que estaba anteriormente el ratón.
*/
private int xAnteriorRaton;
/**
* y en la que estaba anteriormente el ratón
*/
private int yAnteriorRaton;
/**
* Crea un nuevo objeto ArrastrarGrafico.
*/
public LienzoParaArrastrarFiguras()
{
addMouseMotionListener(this);
}
/**
* Añada una figura a la lista de figuras a dibujar
*
* @param figura Una nueva figura a dibujar
*/
public void addFigura(InterfaceFigura figura)
{
listaFiguras.add(figura);
}
/**
* Quita la figura en la lista de figuras a dibujar.
*
* @param figura figura a quitar de la lista.
*/
public void removeFigura(InterfaceFigura figura)
{
listaFiguras.remove(figura);
}
/**
* Para darle un tamaño por defecto al Canvas de dibujo
*
* @return Dimension por defecto.
*/
@Override
public Dimension getPreferredSize()
{
return new Dimension(500, 500);
}
/**
* Dibuja el rectángulo en la posición indicada por por xRectangulo e
* yRectangulo.
*
* @param g Graphics con el que dibujar.
*/
@Override
public void paint(Graphics g)
{
for (InterfaceFigura figura : listaFiguras)
{
figura.dibujate(g);
}
}
/**
* Método al que se llama cuando se arrastra el ratón.
* Se comprueba con el atributo arrastrando si está empezando el arrastre o
* ya se esta en medio del mismo.
* Si se comienza el arrastre, se guardan las coordenadas del ratón que
* vienen en el evento MouseEvent y se cambia el valor del atributo arrastrando.
* Si se está en medio de un arrastre, se calcula la nueva posición del
* rectángulo y se llama al método repaint() para que se pinte.
*
* @param e Evento del ratón
*/
public void mouseDragged(MouseEvent e)
{
// Si comienza el arrastre ...
if (figuraArrastrandose == null)
{
// Se guardan las posiciones del ratón
xAnteriorRaton = e.getX();
yAnteriorRaton = e.getY();
// y se marca que ha comenzado el arrastre.
figuraArrastrandose = dameFigura(e);
}
else
{
// Si ya había empezado el arrastre, se calculan las nuevas
// coordenadas del rectángulo
figuraArrastrandose.setPosicion(
figuraArrastrandose.getX() + (e.getX() - xAnteriorRaton),
figuraArrastrandose.getY() + (e.getY() - yAnteriorRaton));
// Se guarda la posición del ratón para el siguiente cálculo
xAnteriorRaton = e.getX();
yAnteriorRaton = e.getY();
// y se manda repintar el Canvas
repaint();
}
}
/**
* Para ver si el ratón está dentro del rectángulo.
* Si está dentro, puede comenzar el arrastre.
*
* @param e El evento de ratón
*
* @return true si el ratón está dentro del rectángulo
*/
private InterfaceFigura dameFigura(MouseEvent e)
{
for (InterfaceFigura figura : listaFiguras)
{
if (figura.estaDentro(e.getX(), e.getY()))
{
return figura;
}
}
return null;
}
/**
* El ratón se mueve sin arrastrar. Se marca fin de arrastre.
*
* @param e E
*/
public void mouseMoved(MouseEvent e)
{
figuraArrastrandose = null;
}
}
|