3

このコードスニペットについて考えてみましょう

Image img=Toolkit.getDefaultToolkit().getImage("1.png");
g.drawImage(img,0,0,null);

コードが行うことは、画像1.pngをロードしてグラフィックコンテキストに描画することです。今私が観察しているdrawImageのは、最初に呼び出されたときに画像を描画しないことです。代わりに、それ以降の呼び出しで画像を描画します。これは、非同期の画像の読み込みまたはメソッドの遅延動作が原因だと思います。

問題を修正するために私ができることは、javax.swing.ImageIconこのようなクラスを使用することです。

Image img=new ImageIcon("1.png").getImage();
g.drawImage(img,0,0,null);

同じタスクを実行する他のより良い方法を知りたいです。

4

2 に答える 2

6

場合によります。

「低速」接続(インターネットなど)を介して画像を読み込む場合、またはサイズの大きい画像を読み込む場合は、遅延読み込みアプローチを使用することをお勧めします。

これにより、イメージのロードが開始されている間、アプリケーションの実行を継続できます。

Andrewは正しいです。g.drawImage(img,0,0,this)これを使用すると、他のアクションを実行しなくても、画像の読み込みが完了するとコンポーネントが自動的に更新されるため、を使用する必要があります。

アプリケーションが操作の一部を画像に依存している場合、またはローカルで小さな画像を読み込んでいる場合は、次のようなものを使用するだけで十分です...

BufferedImage image = ImageIO.read(imageResource); 
// Where image resource is either a file or local URL (such as an embedded resource)

私は個人的に、ほとんどの場合、バックグラウンドスレッドを使用して画像をロードし、を使用する傾向がありますImageIO。私のpaint方法では、必要に応じて小さなプレースホルダー画像を使用して、画像を読み込んでいることをユーザーに知らせます。

また、ロードする画像のタイプも考慮する必要があります。画像形式のサポートは大きくなりますが、アニメーションGIFの読み込みにImageIOは問題があり、達成するにはかなり多くの作業が必要になります。

ps-コンポーネントpaintメソッドに画像をロードしないでください-ペイントは何度も呼び出すことができ、画像(または他のリソース)をロードすると再ペイントプロセスが劇的に遅くなり、アプリケーションが遅れます...

于 2013-01-03T07:02:22.220 に答える
2

ImageIO.read()画像の読み込みに使用してみてください。これは、画像が完全に読み込まれるまでブロックされます。このページを確認してください。

于 2013-01-03T06:59:04.233 に答える