2012-03-22 3 views
5

私はGraphics2Dパラメータを受け取るpaint()メソッドを持っています。奇妙なことに起こるのは、System.out.printlnが存在しない限り(以下のブロックでコメントする)、キャンバスは何も描画しません。コードブロックに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クラスにあり、BufferStrategyのgetDrawGraphics()メソッドからGraphics2Dを渡します(多くの人がこのことに精通して私が何をしているのか理解してくれることを願っています)。

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ステートメントをコメントアウトすると、キャンバスにグラフィックスは表示されません。そうでない場合は、正しく表示されます。誰でも私を助けることができます???

+7

私はこの点に関して似た問題があり、 'System.out.println()'がスレッドの同期化を引き起こすことを知りました。 – everton

+0

これは深刻な問題で、いくつかの回答が必要だと知っていますが、質問の件名を読むとLOLに抵抗することはできませんでした。 – dbrin

+2

うん、スレッド同期の問題のようですね。私はあなたがこの種のほとんどのバグの原因となっているイベントディスパッチスレッド以外のスレッドから呼び出すと思います。トピックのかなり良い議論のためにhttp://en.wikipedia.org/wiki/Event_dispatching_threadを見てください。 – GreyBeardedGeek

答えて

2

Event SwingUtilitiesを使用して、Event Dispatch Thread(EDT)に切り替える必要があります。以下を参照してください。これは、AWTクラスとSwingクラスとのほとんどすべてのやり取りに必要です。

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

これは、AWTではうまくいくはずのスイングヘルパーライブラリを使用していることに注意してください。ただし、Swingの使用を開始することをお勧めします。

+0

あなたの答えをありがとうが、それでも何も表示されません:(私は問題がスレッドの同期のためではないと思う。 –

+1

スイングから 'JPanel'を使用しているときに正しく動作するかどうかをテストすることができます(マップクラスはJPanelを拡張して追加します。 JPanelはデフォルトでダブルバッファーされており、ペイント関数は互換性があります。そうすれば、問題がBufferedStrategyにあるかどうかを確認できます。 – Thirler

+0

これはうまくいきました!マップをJPanelに変更し、JFrameに追加します。 BufferStrategyのすべてを削除しても問題ないですか?BufferStrategyに問題がありますか?しかし何が間違っているのですか?BufferStrategyがprintln()でうんざりするのはなぜですか? –

関連する問題