web-dev-qa-db-ja.com

Java Graphics.drawImage()はどのように機能し、ImageObserverの役割は何ですか?

JavaのdrawImage()はどのように使用する必要がありますか? JDKのドキュメントが近日公開されるとは思いません。たとえば、すべてのdrawImage署名にはImageObserverが必要ですが、このドキュメントは新規ユーザーにはあまり役立ちません。

20

Graphics.drawImage(img, x, y, null) [または同様のもの]で逃げることができます。 ImageObserverパラメータは、描画操作の進行状況を通知するコールバックです。また、Imageパラメータを非同期でフェッチする場合にのみ実際に役立ちます。

明確にするために、不完全にロードされた画像でdrawImageを呼び出すと、次のようになります。

  1. falseを返します(すぐに)
  2. できるだけ多くのImageを描画します(ロードされているものすべて)
  3. そして、将来のある時点で、より多くの画像が利用可能になったらImageObserverを呼び出します

基本的に、メモリ内でImages(ファイルシステムからロードされるか、プログラムによって構築される)で作業している場合は、ImageObserverパラメータについて心配する必要はありません。ネットワーク全体でImagesをロードしていて、ロードを明示的に待機していない場合は、ImageObserverを使用して、Imageを「完全に」描画する必要があります。 。

25
Kevin Montrose

Imageオブジェクトは必ずしも完全にロードされているわけではありません。不完全な画像に対してGraphics.drawImageが呼び出されると、可能な限り多くの画像が描画され、さらに多くの画像が読み込まれると(ImageObserverを呼び出して)imageUpdateに警告します。

ImageObserverはnullにすることができます。その場合、通知は届きません。これは、画像が読み込まれていることがわかっている場合、または再描画を行う別のメカニズムがすでに存在する場合によく見られます。

ComponentImageObserverを実装し、そのimageUpdateメソッドは影響を受ける領域にrepaintを引き起こすことに注意してください。

8

他の人が示唆しているように、このAPIは、レンダリングされる画像がネットワーク経由で読み込まれると想定されたときに考案されました。ツールキットに画像をロードするように依頼するとき、それは単なるシェルであり、そのサイズとピクセルを知るために必要なバイトはまだネットワークを這っていると想定されます。

この場合、drawImageは最初に呼び出されたときに何もレンダリングしない可能性があります。サイズとピクセルが利用可能になると、ImageObserverに通知されます。の場合 Component implements ImageObserver、その動作は、データが利用可能になったときに再描画することです。

1
Duncan McGregor

実際、私はdrawImage()を何度も使用しました。常にImageObserverパラメーターをnullに設定しました。 Okそれが役に立たないという意味ではありませんが、私はその使用法を知らずに必要なことを何でもしました。

1
Jack