- ベストアンサー
ペイント時のチラツキ予防方法について
現在、下記のpaint関数がrepaint関数を使って50ミリ秒きざみで呼ばれます。すると、画面がチラツクのです。 良い方法はありませんでしょうか? ちなみにdrawImageしている絵は最初の一回だけ描画して、 その絵の上にdrawStringを使ってミリ秒単位で字が書かれるのです。 ************************************************** public void paint(Graphics g) { if (g.drawImage(im, 0, 0, this) != true) { System.out.println("Song_ng"); }else{ //A描画 g.setColor(Color.black); g.setFont(FontA); g.drawString(strTitleA, 90, 25); //B描画 g.setColor(Color.black); g.setFont(FontB); g.drawString(strTitleB, 5, 55); //C描画 g.setColor(Color.black); g.setFont(FontC); g.drawString(strTitleC, 15, 85); //D描画 g.setColor(Color.black); g.setFont(FontD); g.drawString(strTitleD, 105, 120); } } ************************************************* 私なりに画面のチラツキ防止のためにupdate関数を下記のように修正したのですが、チラツキが良くはなりません。 ************************************************* public void update(Graphics g){ paint(g); } *************************************************
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 ダブルバッファリングについて概略だけ説明します。 大きく分けて、2つの作業が必要です。 A.paintメソッド内でのロジック 1.隠し画面用のメモリを確保 Image buff = createImage( ... ); //java.awt.Compenentのメソッド 2.隠し画面に書き込むためのグラフィックコンテキストを取得 Graphics g2 = buff.getGraphics(); 3.画面を完成させる g2.drawText( ... ); 4.完成したものを一気に表示 g.drawImage(buff, ...... ); B.updateメソッドをオーバーライド //updateメソッドは一度画面を消去して再描画するため、上書きして消去させない public void update(Graphics g){ paint(g); }
その他の回答 (2)
- ngsvx
- ベストアンサー率49% (157/315)
画像と文字を重ねて(同じ場所に)表示させていて、 文字がちらついているのだと思いますが、 これは画像が表示される際に文字を上書きして消していることが原因です。 解決するには、 1.画像と文字を重ねない ->文字が画像によって消されることがなくなる 2.見えないところで表示するべきものを完成させて、 完成したものを一気に表示する。 ->ダブルバッファリング のどちらかになります。 画像と文字を重ねたいのなら、ダブルバッファリングを使うしかありません。
お礼
お答えありがとうございました。 >ダブルバッファリング との事ですが、どのように書けばよいのですか?
- nta
- ベストアンサー率78% (1525/1942)
誤解があるのかもしれませんが、文字も全てグラフィクスとして描画されます。gに直接描画されているようですが、Javaならずとも画像のプログラミングでちらつきをなくするためにダブルバッファリングを実装するのは定石ではないでしょうか。 http://www.codec.co.jp/netscape/javascrl.html http://www.wakhok.ac.jp/~tatsuo/kougi98/8shuu/double2.html
お礼
お答えありがとうございました。 教えていただいたURLを参考にダブルバッファリングで組んでみようと思います。 ありがとうございました。
お礼
非常にわかりやすいご説明ありがとうございました。 教えていただいた点を踏まえて組んでみようと思います。 本当にありがとうございました。