• ベストアンサー

違いについて

g.drawImage(buffer,0,0,this);とg.drawImage(buffer,0,0,null);の違いについて教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

こんにちは。先日はポイントをどうも。 ところで、質問は、背景も含めて書いた方がいいと思います。 この書き方だと私以外は回答が困難です。 これはアプレットのpaint()内で、描画をするときの問題ですね。 drawImageの最後の引数にはImageObserverが入ります。 まあそれはAPIドキュメントを見ればわかりますね。 ではImageObserverとはなにか、という事になります。 普通、「イメージ」と言ったら、画面に表示されたイメージや、そのデータを考えるでしょうが、 Javaでのイメージは少し違います。 Imageは一種のストリーム(流れ)のように考えられています。 インターネットを通じてイメージデータをやりとりするとき、かなり時間がかかるため、 「静的なイメージがすぐに表示される」としてしまうと、 イメージデータを読み込むまでプログラムが止まってしまうからです。 g.drawImage(image, x, y, observer)は、 「イメージの描画を行う」のではなくて、 「イメージの描画を開始する」のような意味を持っています。 イメージを時間をかけて読み込むわけですが、 「イメージの大きさが判明した」「読み込みが完了した」など、 読み込んだ段階があります。 描写する側では読み込んだ段階ごとにいろいろ仕事をしなければなりません。 その情報を与える相手が、ImageObserverです。 ImageObserverは、AppletとかCanvasとかのイメージを描写するコンポーネントです。 通常drawImage()は、それらのpaint()の中で使われるので、thisを使います。 まとめると、ImageObserverを指定しないと、 正常に表示されないかもしれないのです。 問題のプログラムで使っていたのは、ダブルバッファリング用のImageですので、 イメージデータの読み込みには時間はほとんどかからないと予想され、 実際にはnullを指定しても動くかもしれません。 (このへんは私にもよくわかりません) ただ、ちゃんとthisを指定するのが基本なので、そちらを奨めます。 追伸、一つ前の質問も見ているのですが、 ちょっと問題がややこしいので答えかねています。 すみません。

mos21
質問者

お礼

丁寧な回答ありがとうございます^^paint()内でnullと記述してrun()内でrepaintしたところうまく動きました。thisを記述したらrepaintがないのに画像が次々と表示されてしまいました。一つ前の質問は、わかりずらいし何が聞きたいのかわからないですね(^^;すいませんでした。でも解決しました!わざわざありがとうございます^^/

関連するQ&A