2012-03-22 5 views
5

Mam tę metodę paint(), które otrzymują parametr Graphics2D. Dziwne jest to, że chyba obecny jest plik System.out.println (który komentuję w poniższym bloku), płótno niczego nie narysuje.Dlaczego mój kod graficzny nie działa, chyba że w bloku kodu znajduje się System.out.println?

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); 

       } 
      } 
     } 
    } 
} 

Tutaj używam BufferStrategy rysować na płótnie i dodać go do ramy. Ta metoda znajduje się w Mapie klas, która zostanie przekazana Graphics2D z metody getDrawGraphics() z BufferStrategy (Mam nadzieję, że wiele osób zna te rzeczy, aby zrozumieć, co robię).

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(); 

    } 
} 

Ten kod jest z klasy Canvas. Jak widać, metoda paint() jest oddzielna od klasy Canvas (którą nazywam GameTest). Więc jeśli skomentuję komunikat println, to grafika nie jest wyświetlana w obszarze roboczym, w przeciwnym razie jest wyświetlana poprawnie. Ktoś może mi pomóc ???

+7

Jedną rzeczą, która przychodzi mi do głowy jest to, że miałem podobne problemy dotyczące tego i odkryłem, że 'System.out.println()' powoduje synchronizację Nici. – everton

+0

Wiem, że to poważny problem i potrzebujesz odpowiedzi, ale nie mogłem się oprzeć LOLowi, kiedy przeczytałem twój temat pytania :) – dbrin

+2

Tak, to brzmi jak problem z synchronizacją wątków. Zgaduję, że wywołujesz to z wątku innego niż wątek wysyłający zdarzenia, co jest przyczyną większości tego typu błędów. Zajrzyj na http://en.wikipedia.org/wiki/Event_dispatching_thread po całkiem dobrą dyskusję na ten temat. – GreyBeardedGeek

Odpowiedz

2

Powinieneś użyć SwingUtilities, aby przełączyć się do wątku wyświetlania zdarzeń (EDT), patrz poniżej. Jest to wymagane w przypadku prawie wszystkich interakcji z klasami AWT i Swing.

Należy zauważyć, że używa to biblioteki pomocników wahadłowych, która powinna być dobra dla AWT, ale jeszcze lepiej jest zacząć używać Swing.

+0

Dzięki za odpowiedź, ale nadal nie pokazuje nic :(Myślę, że problem nie jest z powodu synchronizacji wątku. jest oparty na samouczku z cokeandcode.com, a kod witryny działa perfekcyjnie! (bez rzeczy invokeLater()) –

+1

Możesz sprawdzić, czy działa poprawnie, gdy używasz 'JPanel' z huśtawki. (Poproś klasę Map o rozszerzenie JPanel i dodaj do JPFame) JPanel jest domyślnie podwójnie buforowany, a funkcja paint wygląda na kompatybilną, dzięki czemu można sprawdzić, czy problem jest w BufferedStrategy – Thirler

+0

Udało się !! Zmieniam Mapę na JPanel i dodaję ją do JFrame i usunąć wszystkie rzeczy z BufferStrategy i wszystko działało dobrze, więc problem tkwi w prawach BufferStrategy? Ale co może być nie tak? Dlaczego BufferStrategy zepsuł println()? –