私は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ステートメントをコメントアウトすると、キャンバスにグラフィックスは表示されません。そうでない場合は、正しく表示されます。誰でも私を助けることができます???
私はこの点に関して似た問題があり、 'System.out.println()'がスレッドの同期化を引き起こすことを知りました。 – everton
これは深刻な問題で、いくつかの回答が必要だと知っていますが、質問の件名を読むとLOLに抵抗することはできませんでした。 – dbrin
うん、スレッド同期の問題のようですね。私はあなたがこの種のほとんどのバグの原因となっているイベントディスパッチスレッド以外のスレッドから呼び出すと思います。トピックのかなり良い議論のためにhttp://en.wikipedia.org/wiki/Event_dispatching_threadを見てください。 – GreyBeardedGeek