Java:createImageの完了待ちにprepareImage

 

こんにちは、管理人イガジーです。
Javaには、処理をスレッドで行なうメソッド(関数)があります。

例えば、createImage というリソースを読み込むメソッドは
スレッド処理されるので、直後にその読み込んだリソースを
使おうとしても、読込未完了で使えない事があります。

例えば、
Image img;
public void read_resouce(String filename) {
URL url = this.getClass().getResource(filename);
try {
img = this.createImage((ImageProducer)url.getContent());
} catch(Exception ex){
System.out.println(filename + " is not found!");
System.exit(1);
}
}
という関数を書いておき
コンストラクタで、
read_resource("/com/mltlab/sample.png");
g.drawImage(img,0,0,null);
などと、直後に使おうとしても、描画されません。

対処としては、prepareImage を使います。
prepareImage は、読込完了していれば true,
未完であれば false を返します。

public void wait_resouce() {
int t;
for (t=0;!this.prepareImage(imc,this);++t){
sleep(10);
}
System.out.printf("prepare %d\n", t);
}
public void sleep(long msec) {
try {
Thread.sleep(msec);
} catch (InterruptedException e) {}
}
コンストラクタではread_resource("/com/mltlab/sample.png");
wait_resouce();
g.drawImage(img,0,0,null);
という感じで、完了待ちをすれば無事に表示されます。

なお、createImage は、Frame 内で使います。すなわち、
img = this.createImage((ImageProducer)url.getContent());
の this は、Frame です。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)