La Web del Programador: Comunidad de Programadores
 
    Pregunta:  3599 - USO DE GRÁFICOS EN APLICACIONES
Autor:  Eduard Pascual Saez
Sé como usar la clase "Graphics" del JDK en applets, pero cuando intento usar "repaint()" desde una aplicación no pasa nada. ¿Como puedo dibujar en las aplicaciones?

En la primera respuesta, me decían que debía contener código en el método paint(). Esto es lógico, pero el problema fue que ese código nunca se llega a ejecutar.
En la segunda respuesta se me dijo que usase getGraphics() para tener un objeto Graphics con el que llamar directamente a paint(); la idea no era mala pero el método me devolvió un null.

Gracias por vuestro servicio.

  Respuesta:  Alex .
El metodo repaint() llama al método paint() y éste a update().

Debes redefinir paint() o update() con los gráficos que quieras dibujar.

Pero el método update() tiene el problema de que no refresca la imagen cuando minimizas u ocultas la ventana, lo que si hace el método paint(). Asi que mejor usa este.

Lo que yo hago normalmente es usar una clase que extiende de la clase Canvas y también aplico en élla el método de doble buffer para evitar el parpadeo del redibujado.
package MiPaquete;


//import java.awt.Canvas;
import java.awt.*;
import java.awt.image.*;

public class MiCanvas extends Canvas {

int anchoCanvas;
int altoCanvas;

//Doble buffer
Image imag;
Graphics gBuffer;

Image img_fondo;

public MiCanvas(){
this.setBackground(new Color(200, 250, 240));
img_fondo = Toolkit.getDefaultToolkit().getImage("fondo.gif");
}
public MiCanvas(Vector objetos, String archivo_imagen){
this.objetos = objetos;
this.setBackground(new Color(200, 250, 240));
img_fondo = Toolkit.getDefaultToolkit().getImage(archivo_imagen);
}

public void paint(Graphics g){
//con paint() no se borrará el dibujo al poner otras ventanas encima o al redimensionar la ventana.
update(g); //paint siempre llama a update();
}

public void update(Graphics g){
Dimension d=this.getSize();
if((gBuffer==null)||(d.width!=anchoCanvas)||(d.height!=altoCanvas)){
anchoCanvas = d.width;
altoCanvas = d.height; //ahora se podrá cambiar el tamaño del panelcanvas sin problemas de redibujado.

imag=createImage(anchoCanvas, altoCanvas);
gBuffer=imag.getGraphics();
}
gBuffer.drawImage(img_fondo, 0, 0, anchoCanvas, altoCanvas, this);

//funciones
gBuffer.setColor(Color.cian);
gBuffer.drawline(10,10,50,10);
//..... lo que sea ....

//transfiere la imagen al contexto gráfico del canvas
g.drawImage(imag, 0, 0, null);
}

}

Un saludo.

  Respuesta:  Eduard Pascual Sáez
Hace dos o tres años que se publicó mi pregunta y no he obtenido ninguna respuesta útil. A pesar de ello, he podido conseguir la respuesta desde otras fuentes:
Aunque no resulte posible usar el AWT en aplicaciones (no applets), que es lo que pretendía, la biblioteca Swing de Java2 funciona mucho mejor y permite hacer todo lo que no se podia hacer con AWT (dentro del ámbito de la programación gráfica, que nadie piense mal :-P). Así pues, la solucion pasa por hacer una visitita en java.sun.com y descargarse una edicion cualquiera de Java2 (yo he probado la standard y cumple con mis necesidades satisfactoriamente)

  Respuesta:  hasted _
Mírate el tutorial de SUN allí te explica perfectamente que para usar los gráficos, se utilizan esas funciones, y que lo más sencillo es redefinir el método paint(Graphics g) y escribir ahí el código de lo que quieres que haga cada vez que se dibuje el componente. ta lué !

  Respuesta:  Oscar Alvarez Vilaplana
En vez de usar repaint, haz:
Graphics g=getGraphics(); //principio de funcion
paint(g); //en vez de repaint()

Espero que te sea útil!

  Respuesta:  Juan Pablo Acosta Campos
El metodo repaint todo lo que hace es llamar al paint component y si deseas que aparezca un dibujo, tienes que
programar el paint component con el repaint para desplegar una imagen. Ademas debes darle un poco de tiempo ya que el refrescamiento no es inmediato