- 締切済み
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()を実行するにはどうすればいいでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
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(); } }