Tengo este método paint() que recibe un parámetro Graphics2D. Lo extraño que sucede es que a menos que haya un System.out.println presente (que comente en el siguiente bloque), el lienzo no dibujará nada.¿Por qué mi código de gráficos no se ejecuta a menos que haya un System.out.println en el bloque de código?
public class Map{
public void paint(Graphics2D g){
//fill background to black
g.setColor(Color.black);
g.fillRect(0, 0, TILE_SIZE*WIDTH, TILE_SIZE*HEIGHT);
//draw the tiles and buildings
for(int i=0;i<WIDTH;i++){
for(int j=0;j<HEIGHT;j++){
if(map[j][i] == CLEAR){
//System.out.println("");
g.setColor(Color.gray);
g.fillRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE);
g.setColor(Color.red);
g.drawRect(i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE);
}
}
}
}
}
Aquí uso BufferStrategy para dibujar en lienzo y agregarlo a un marco. Este método está en el mapa de clase, al que se le pasará un Graphics2D del método getDrawGraphics() de BufferStrategy (espero que muchas personas estén familiarizadas con esto para comprender lo que estoy haciendo).
public class MapTest extends Canvas{
private Map map;
public MapTest(){
Frame frame = new Frame("MAP");
frame.add(this);
frame.setVisible(true);
createBufferStrategy(2);
strategy = getBufferStrategy();
//draw the map
Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
//g.translate(100, 100);
map.paint(g);
g.dispose();
strategy.show();
}
}
Este código pertenece a la clase Canvas. Como puede ver, el método paint() está separado de la clase Canvas (que yo denomino GameTest). Por lo tanto, si hago un comentario sobre la instrucción println, entonces no se muestran gráficos en el lienzo, de lo contrario, se muestra correctamente. ¿¿¿Alguien puede ayudarme???
Una cosa que me viene a la mente es que tuve problemas similares con respecto a esto, y descubrí que el 'System.out.println()' causa la sincronización del hilo. – everton
Sé que este es un problema grave, y necesita algunas respuestas, pero no pude resistirme a LOL cuando leí el tema de su pregunta :) – dbrin
Sí, parece un problema de sincronización de hilos. Supongo que está llamando a esto desde un hilo que no sea el hilo de envío de eventos, que es la causa de la mayoría de los errores de este tipo. Eche un vistazo a http://en.wikipedia.org/wiki/Event_dispatching_thread para una discusión bastante buena del tema. – GreyBeardedGeek