Este repintado incremental es útil, por ejemplo, si un programa desea actualizar una capa por encima de las ya existentes en el componente. El ejemplo java1503.java, es un programa que se beneficia del uso de update() para realizar este repintado incremental. Al ejecutarlo, aparecerán dos ventanas en las cuales se van a ir pintado líneas que unirán cada uno de los puntos en que se pulse el ratón. El lector podrá comprobar la diferencia de realizar acciones en una y en otra. El código del ejemplo es el que se reproduce.
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class java1503 {
public static void main(String[] args) {
WindowListener conclusion = new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
};
// Se crea el Frame en el que se utiliza paint() directamente
Frame f1 = new Frame( "Parpadeo - Pulsa el ratón para pintar líneas" );
f1.addWindowListener( conclusion );
f1.add( new MiCanvas( new Vector()),BorderLayout.CENTER );
f1.pack();
f1.show();
// Se crea el Frame en el que se realiza el repintado incremental a
// través de update()
Frame f2 = new Frame( "Suavidad - Pulsa el ratón para pintar líneas" );
f2.addWindowListener( conclusion );
f2.add(new MiCanvasSuave( new Vector()),BorderLayout.CENTER );
f2.pack();
// Recogemos los límites del Frame anterior, para colocar el nuevo
// a continuación
Rectangle limF1 = f1.getBounds();
f2.setLocation( limF1.x+limF1.width,limF1.y );
f2.show();
}
}
// Esta clase es un Canvas que grnera un fondo semicomplejo con vectores
// que se van creando según se va haciendo click en diferentes posiciones
// de ese canvas.
// Pinta el área completa dentro de paint()
class MiCanvas extends Canvas {
// Fijamos el array de colores que se va a utilizar para pintar los
// vectores y que el fondo sea cada vez más multicolor
protected Color colores[] = {
Color.red, Color.yellow, Color.blue,
Color.green, Color.pink, Color.orange,
Color.white, Color.magenta, Color.cyan
};
protected Vector puntos;
protected int vectoresPintados;
public MiCanvas( Vector puntos ) {
this.puntos = puntos;
// Clase anidada para recoger los eventos de pulsación del botón
// delr atón
addMouseListener( new MouseAdapter() {
public void mousePressed( MouseEvent evt ) {
MiCanvas c = (MiCanvas)evt.getSource();
// Se incorpora un nuevo vector
c.puntos.addElement( evt.getPoint() );
c.repaint();
}
});
}
public Dimension getPreferredSize() {
// Tamaño del Canvas
return new Dimension( 400,400 );
}
/*
El lector puede descomentar este método para comprobar que si
se sobreescribe el método update() sin BORRAR el fondo, se ve
afectado el parpadeo. No obstante, aunque ese parpadeo es menos
dramático, todavía se nota que se produce
public void update( Graphics g ) {
paint( g );
}
*/
public void paint( Graphics g ) {
// Se repinta todo, primero el fondo...
pintaFondo(g);
// ...y a continuación, todos los vectores
vectoresPintados = 0;
for( int i=0 ; i < dim =" getSize();" grosor =" 5;" x =" 0;" y="0;" p1 =" (Point)puntos.elementAt(" p2 =" (Point)puntos.elementAt(" i="vectoresPintados;">
Aquí se muestran las respectivas ventanas del programa hecho en eclipse:
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
public class java1503 {
public static void main(String[] args) {
WindowListener conclusion = new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
};
// Se crea el Frame en el que se utiliza paint() directamente
Frame f1 = new Frame( "Parpadeo - Pulsa el ratón para pintar líneas" );
f1.addWindowListener( conclusion );
f1.add( new MiCanvas( new Vector()),BorderLayout.CENTER );
f1.pack();
f1.show();
// Se crea el Frame en el que se realiza el repintado incremental a
// través de update()
Frame f2 = new Frame( "Suavidad - Pulsa el ratón para pintar líneas" );
f2.addWindowListener( conclusion );
f2.add(new MiCanvasSuave( new Vector()),BorderLayout.CENTER );
f2.pack();
// Recogemos los límites del Frame anterior, para colocar el nuevo
// a continuación
Rectangle limF1 = f1.getBounds();
f2.setLocation( limF1.x+limF1.width,limF1.y );
f2.show();
}
}
// Esta clase es un Canvas que grnera un fondo semicomplejo con vectores
// que se van creando según se va haciendo click en diferentes posiciones
// de ese canvas.
// Pinta el área completa dentro de paint()
class MiCanvas extends Canvas {
// Fijamos el array de colores que se va a utilizar para pintar los
// vectores y que el fondo sea cada vez más multicolor
protected Color colores[] = {
Color.red, Color.yellow, Color.blue,
Color.green, Color.pink, Color.orange,
Color.white, Color.magenta, Color.cyan
};
protected Vector puntos;
protected int vectoresPintados;
public MiCanvas( Vector puntos ) {
this.puntos = puntos;
// Clase anidada para recoger los eventos de pulsación del botón
// delr atón
addMouseListener( new MouseAdapter() {
public void mousePressed( MouseEvent evt ) {
MiCanvas c = (MiCanvas)evt.getSource();
// Se incorpora un nuevo vector
c.puntos.addElement( evt.getPoint() );
c.repaint();
}
});
}
public Dimension getPreferredSize() {
// Tamaño del Canvas
return new Dimension( 400,400 );
}
/*
El lector puede descomentar este método para comprobar que si
se sobreescribe el método update() sin BORRAR el fondo, se ve
afectado el parpadeo. No obstante, aunque ese parpadeo es menos
dramático, todavía se nota que se produce
public void update( Graphics g ) {
paint( g );
}
*/
public void paint( Graphics g ) {
// Se repinta todo, primero el fondo...
pintaFondo(g);
// ...y a continuación, todos los vectores
vectoresPintados = 0;
for( int i=0 ; i < dim =" getSize();" grosor =" 5;" x =" 0;" y="0;" p1 =" (Point)puntos.elementAt(" p2 =" (Point)puntos.elementAt(" i="vectoresPintados;">
Aquí se muestran las respectivas ventanas del programa hecho en eclipse:
Aquí se muestran las ventanas una vez compilado el programa:
Aquí se muestran las diferentes lineas y gráficos que se pueden construir una vez compilado el programa:
