1. Vamos a realizar un ejercicio que nos permita practicar cómo dibujar en Java, y posteriormente realizar animaciones con esos dibujos.
... class MiPanel extends JPanel { ... public void paint(Graphics g) { g.setColor(Color.blue); g.fillRect(5, 0, 100, 25); g.setColor(Color.green); g.fillOval(125, 0, 100, 50); } } class MiCanvas extends Canvas { ... public void paint(Graphics g) { g.setColor(Color.blue); g.fillRect(5, 0, 100, 25); g.setColor(Color.green); g.fillOval(125, 0, 100, 50); } }Observa que los dos (panel y canvas) dibujan las figuras en sus mismas coordenadas (relativas a cada uno), de forma que la apariencia en los dos es la misma.
Figura 1. Apariencia de la aplicación de dibujar. El panel superior es MiPanel, y el inferior es MiCanvas
public class Ej1 extends JFrame { MiPanel mp = new MiPanel(); MiCanvas mc = new MiCanvas(); int yObj = 0; ...
public class Ej1 extends JFrame implements Runnable { MiPanel mp = new MiPanel(); MiCanvas mc = new MiCanvas(); int yObj = 0; Thread t = new Thread(this); ...
Al final del constructor, iniciamos el hilo:
public Ej1() { ... t.start(); }
Finalmente, definimos un método run en la clase Ej1, que haga las animaciones. Lo que va a hacer es incrementar la yObj de uno en uno, hasta 100, y repintar el panel y el canvas en cada iteración. Dormirá 100 ms entre cada iteración para permitir que el proceso principal (la ventana) siga su curso.
public void run() { while (yObj < 100) { yObj++; mp.repaint(); mc.repaint(); try { Thread.currentThread().sleep(100); } catch (Exception ex) {} } }
Finalmente, nos queda modificar un poco los métodos paint de MiCanvas y MiPanel, para hacer que la coordenada Y donde se dibujan las figuras no sea fija, sino que sea la variable yObj:
... class MiPanel extends JPanel { ... public void paint(Graphics g) { g.setColor(Color.blue); g.fillRect(5, yObj, 100, 25); g.setColor(Color.green); g.fillOval(125, yObj, 100, 50); } } class MiCanvas extends Canvas { ... public void paint(Graphics g) { g.setColor(Color.blue); g.fillRect(5, yObj, 100, 25); g.setColor(Color.green); g.fillOval(125, yObj, 100, 50); } }
class MiPanel extends JPanel { ... public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); g.setColor(Color.blue); g.fillRect(5, yObj, 100, 25); g.setColor(Color.green); g.fillOval(125, yObj, 100, 50); } }
class MiCanvas extends Canvas { Image backbuffer = null; public MiCanvas() { } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { if(backbuffer == null) backbuffer = createImage(getWidth(), getHeight()); // Dibujamos los gráficos en el backbuffer Graphics off_g = backbuffer.getGraphics(); off_g.clearRect(0, 0, getWidth(), getHeight()); off_g.setColor(Color.blue); off_g.fillRect(5, yObj, 100, 25); off_g.setColor(Color.green); off_g.fillOval(125, yObj, 100, 50); // Volcamos el backbuffer a pantalla g.drawImage(backbuffer, 0, 0, getWidth(), getHeight(), this); g.dispose(); } }
Observa como hacemos el mismo dibujo, pero sobre los gráficos del backbuffer
(off_g), no sobre los del canvas (g). Después volcamos la
imagen entera. Observa también que es necesario limpiar el backbuffer
(con un clearRect) antes de dibujar, puesto que de lo contrario
dejaríamos el rastro visto en MiPanel.
PARA ENTREGAR