2016-11-19 25 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); 
    } 
} 

但是,你应该设定一个计时器调用repaint,而不是明确地延迟paint()方法。

+0

感谢罗伯托。它解决了我的问题。但我不明白。哦!!!可能它是作为一个橡皮擦......? – 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(),它调用update()....)。这就是你的代码最终抛出异常的原因。 –

+0

一旦你删除了更新,代码的作品种类,但每次绘制圆圈都与前面的圈子重叠。以防止您想要清除g.clearRect调用所执行的框架区域。 clearRect的参数是x,y,其中的高度代表组件的边界,这是getBounds()返回的值。 让我知道如果有什么东西还不清楚。 –