• 締切済み

Appletのrepaint()が動作しません

import java.applet.*; import java.awt.*; /*<applet code="zxy" width="1000" height="1000"></applet>*/ class Object extends Applet { protected int x; /* オブジェクトのx座標 */ protected int y; /* オブジェクトのy座標 */ protected int width; protected int height; Image buffer; Graphics buffer_g; Dimension d = getSize(); public Object() { x = 0; y = 0; width = 0; height = 0; } } /* 楕円クラス */ class Oval extends Object implements Runnable { public Oval() { width = (int)(Math.random() * 56 + 10); height = (int)(Math.random() * 56 + 10); } public void run() { while( true ){ try{ repaint(); Thread.sleep(50); } catch( Exception e ){} } } public void paint( Graphics g ) { if( buffer_g == null ) buffer_g = buffer.getGraphics(); Dimension d = getSize(); buffer_g.setColor( Color.white ); buffer_g.fillRect( 0, 0, d.width, d.height ); buffer_g.setColor( Color.black ); buffer_g.drawOval( x, y, width, height ); x += (int)(Math.random() * 10); y += (int)(Math.random() * 10); g.drawImage( buffer, 0, 0, this ); } } public class A extends Applet { Image buffer; Graphics buffer_g; Oval ov1 = new Oval(); Thread thOv1 = new Thread( ov1 ); public void start() { thOv1.start(); Dimension d = getSize(); buffer = createImage( d.width, d.height ); } } 上記プログラムを実行しても、paint()の中が実行されずにtryブロックを繰り返すだけになってしまいます。paint()を実行するにはどうすればいいでしょうか?

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

OvalクラスのAppletとしての実体が Aクラスとは別物になっているためかも class Oval implements Runnable {   Applet objApplet;   public Oval(Applet ap )   {     objApplet = ap;   }   public void run()   {     while( true ){       try{         // repaintではなく直接paintを呼ぶ         paint( objApplet.GetGraphics() );         Thread.sleep(50);       }       catch( Exception e ){}     }   }   public void paint( Graphics g )   {     if ( buffer_g == null )       buff_g = buffer.getGraphics();     // ここで毎回書き直すより     // runの whileループに入る前に描画すれば良いように思う     buffer_g.clearRect( 0, 0, width, height );     buffer_g.setColor( Color.black );     buffer_g.drawOval( 0, 0, width - 1, height -1 );     // 呼び出しもとのAppletに描画     g.clearRect( x, y, width, height );     x += (int)(Math.Random() * 10 );     y += (int)(Math.Random() * 10 );     g.drawImage( buffer, x, y, objApplet );   }   // その他省略 } class A extends Applet {   // フィールドの宣言のみ   Oval ovl;   Thread thOvl;   public init() {     ovl = new Ovl( this );     thOvl = new Thread( ovl );   }   public void start() {     thOvl.start();   } }

関連するQ&A