- 締切済み
画像表示アプレットプログラムについて
Javaのプログラムを勉強中です。 javaを理解するために下記のプログラム(zukei.java)を作成しました。 このプログラムを実行(appletviewer zukei.java)すると エラーにはなりませんが、(3)の行により画像("b.jpg")がすぐには表示されません。表示されたWindowにほかのWindowをいったんのせてから動かすと(3)行により画像"b.jpg"が表示されます。 (1)(2)の行は最初からうまく動作して表示されます。 もちろん(3)のappletをthisにするとうまく動作します。 理由がわかりません。 どなたかご教授ください。 プログラム zukei.class *<APPLET CODE="zukei.class" WIDTH=500 HEIGHT=500></APPLET> */ import java.applet.*; import java.awt.Graphics; import java.awt.*; public class zukei extends Applet { Applet applet; Image myimage; int iKai; public zukei(){ applet = this.applet; } public zukei(Applet applet) { this.applet = applet; } public void init(){ iKai = 0; myimage = getImage(getDocumentBase(),"b.jpg"); } public void paint(Graphics g) { kaku(); //(1) g.drawArc(100,150,50,50,0,360); //(2) g.drawImage(myimage,10,300,180,180,applet); //(3) } public void kaku(){ System.out.println("ABC" + iKai++); } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- liar_adan
- ベストアンサー率48% (730/1515)
ここのところ、 >public zukei(){ >applet = this.applet; >} 結局のところ、同じ変数に同じ変数を代入しており、 しかもそれは初期化されていないからnullです。 つまり >g.drawImage(myimage,10,300,180,180,applet); //(3) は >g.drawImage(myimage,10,300,180,180,null); //(3) になっていると考えられます。 JavaのImageは静的なデータではなくて、 「読み込むのに時間がかかるデータの流れ」 と考えてください。 drawImageの最後にImageObserberが必要とされるのは、 「イメージデータの流れぐあいを教えて、画面を更新させる」 意味があります。 この場合適当なImageObserverはアプレット自身、つまりthisです。 だから、最初に描画しようと思ったとき、 「paint()が呼び出される」→ 「drawImage()が呼び出される」→ 「イメージデータはすぐには来ず、描画が終わってないけれど、すぐに復帰する(APIドキュメント参照)」→ 「更新を通知しようにも、ImageObserverがnullなので通知できない」→ 「描画できないままになる」 となっているのだと思います。 2回目以降(他のウィンドウを重ねたとき)は、 イメージデータとしては読み込みが済んでいるので 描画されるのではないでしょうか。