2016-11-19 11 views
-2

Javaスレッドを使用してボールをバウンスするコードを記述しました。しかし、私はそれをクリアすることはできません/ボールが下に移動するときにそれをリフレッシュする。フレームをリフレッシュするJavaスレッドの問題

import java.awt.*; 

class myFrame extends Frame { 
    public void paint(Graphics g) { 
     try { 
      for (int i = 10; i <= 400; i++) {        
       g.drawOval(100,i+100,50,50); 
       update(g);            
       repaint();        
       Thread.sleep(500);    
      } 
     } catch(Exception ex) { 
      System.out.println(ex); 
     } 
    } 
} 

class BallTest { 
    public static void main(String cp[]) { 
     myFrame mf = new myFrame(); 
     mf.setSize(500,500); 
     mf.setVisible(true); 
    } 
} 

答えて

0

update()に電話をかけてはいけません。あなたの目的は、前のボールをクリアするためだった場合、これは動作します:

import java.awt.*; 

class myFrame 
extends Frame 
{ 
    public void paint(Graphics g) 
    { 
     try 
     { 
      for(int i=10;i<=400;i++) 
      { 
       g.drawOval(100,i+100,50,50); 
       repaint(); 
       Thread.sleep(500); 
       Rectangle r = getBounds(); 
       g.clearRect(r.x, r.y, r.width, r.height); 
      } 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex); 
     } 
    } 
} 

class BallTest 
{ 
    public static void main(String cp[]) 
    { 
     myFrame mf = new myFrame(); 
     mf.setSize(500,500); 
     mf.setVisible(true); 
    } 
} 

をしかし、あなたはおそらく、セットアップタイマーが明示的にpaint()メソッドを遅らせるのではなく、repaintを呼び出す必要があります。

+0

ありがとうRoberto。それは私の問題を解決した。しかし、私は理解していません。ああ!!!それは消しゴムとして働いているかもしれない...? – ShailendraRPhadke

+0

わからないことはよく分かりませんが、もっと説明しようと思います。あなたのpaint()では、あなたはupdate()を呼び出していました。理由は分かりませんが、ここで確認できます:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/awt/Component.java#Component .update%28java.awt.Graphics%29では、update()の実装は実際にpaint()を呼び出します。これはあなたが無限回帰(paint())を呼び出すupdate()を呼び出すpaint()を呼び出していることを意味します。それがあなたのコードが最終的に例外を投げていた理由です。 –

+0

更新プログラムを削除すると、コードの種類は機能しますが、円が描画されるたびに前回の円と重なって表示されます。 g.clearRect呼び出しが行うフレーム領域をクリアしないようにします。 clearRectへの引数は、getBounds()が返すコンポーネントの境界を表すx、y、およびheightです。 まだ不明な点がある場合は教えてください。 –

関連する問題