2012-03-22 18 views
5

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???

+7

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

+0

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

+2

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

Respuesta

2

Debe usar las SwingUtilities para cambiar al subproceso de distribución de eventos (EDT), consulte a continuación. Esto es necesario para casi todas las interacciones con las clases AWT y Swing.

SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      new MapTest(); 
     }  
    } 

Tenga en cuenta que este utiliza una biblioteca de oscilación ayudante, que debería estar bien para AWT, pero aún mejor es comenzar a usar Swing.

+0

Gracias por su respuesta, pero todavía no muestra nada :(Supongo que el problema no se debe a la sincronización del hilo. En realidad, mi código se basa en el tutorial de cokeandcode.com y el código del sitio funciona perfectamente (sin invokeLater() cosas) –

+1

Puede probar si funciona correctamente cuando usa 'JPanel' desde swing. (Haga que su clase Map extienda JPanel y agregue a un JFrame). El JPanel tiene doble buffer por defecto y la función de pintura parece compatible. De esta forma puedes ver si el problema está en BufferedStrategy. – Thirler

+0

¡Funcionó! Cambio Mapa a JPanel y lo agregué al JFrame y elimine todas las cosas de BufferStrategy y todo funcionó bien! Entonces el problema está en BufferStrategy ¿verdad? ¿Pero qué puede estar mal? ¿Por qué BufferStrategy estropea con un println()? –

Cuestiones relacionadas