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 ???
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
Wiem, że to poważny problem i potrzebujesz odpowiedzi, ale nie mogłem się oprzeć LOLowi, kiedy przeczytałem twój temat pytania :) – dbrin
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