Почему мой графический код не запускается, если в блоке кода нет System.out.println? - PullRequest
5 голосов
/ 22 марта 2012

У меня есть этот метод paint (), который получает параметр Graphics2D. Странная вещь, которая случается, состоит в том, что, если не присутствует 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);

                }
            }
        }
    }
}

Здесь я использую BufferStrategy для рисования на холсте и добавления его в фрейм. Этот метод находится в классе Map, которому передается Graphics2D из метода getDrawGraphics () из BufferStrategy (я надеюсь, что многие знакомы с этим материалом, чтобы понять, что я делаю).

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

    }
}

Этот код из класса Canvas. Как видите, метод paint () отделен от класса Canvas (который я называю GameTest). Поэтому, если я закомментирую оператор println, то на холсте не будет отображаться графика, в противном случае он будет отображаться правильно. Любой может помочь мне ???

1 Ответ

2 голосов
/ 23 марта 2012

Вы должны использовать SwingUtilities, чтобы переключиться на поток обработки событий (EDT), см. Ниже. Это требуется почти для всех взаимодействий с классами AWT и Swing.

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

Обратите внимание, что здесь используется библиотека Swing Helper, которая подходит для AWT, но еще лучше начать использовать Swing.

...