2014-05-02 62 views
0

我正在写一个小的JAVA小程序。Java applet没有正确响应

其中获得1到6之间的随机数并将它们打印在 APPLET屏幕上。 我想要做的是..在屏幕上循环50次,并打印各种randdom数字。 [每次清除前一个号码]。

而且这个循环之后..它打印在小程序的任何1张最后的随机数..

我的问题是:循环。它打印所有数字在每个ither和屏幕没有得到清除 。 有什么不对?我已经尝试了许多清除applet屏幕的方法,如绘制矩形或使用clearRect()函数。 没有任何工作。 这是代码。

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.util.Random; 



public class Shapes extends Applet{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    Random r = new Random(); 
    Dimension d = getSize(); 
    Font f = new Font("TimesRoman", Font.BOLD, 96); 
    public void paint(Graphics g) 
    { 
     for(int m=0;m<=50;m++){  
       int k = Math.abs((r.nextInt()) % 6) + 1; 
       g.setFont(f); 
       g.setColor(Color.BLACK); 
       g.drawString(String.valueOf(k) , 70, 100); 
       g.setColor(Color.WHITE); 
       g.drawRect(0, 0, d.width, d.height); 
       try{Thread.sleep(70);}catch(Exception e){} 
     } 



    } 

} 
+1

1)为什么代码的小程序?如果这是由于规格。由老师,请参考[为什么CS老师应该停止教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)。 2)为什么选择AWT而不是Swing?看到我对[Swing extras over AWT]的回答(http://stackoverflow.com/a/6255978/418556)有很多很好的理由放弃使用AWT组件。 –

回答

1

问题在于,在对象创建时,小程序没有获得大小,所以您必须等待以获取小程序的维度。例如,在渲染时,类似这样的:

public void paint(Graphics g) 
{ 
    d = getSize(); 
    for(int m=0;m<=50;m++){ 
     g.clearRect(0, 0, (int) d.getWidth(), (int) d.getHeight()); 

     int k = Math.abs((r.nextInt()) % 6) + 1; 
     g.setFont(f); 
     g.setColor(Color.BLACK); 
     g.drawString(String.valueOf(k) , 70, 100); 
     try{Thread.currentThread().sleep(70);}(Exception e){} 
    } 
} 
+0

非常感谢。..它的工作,我理解这个概念完美.. :) –

+0

我仍然不认为在美国东部时间线上的'Thread.sleep'是一个好主意... – DankMemes

+0

我根据你@ZoveGames ,这是真的不推荐(这是一件坏事)在EDT调用sleep();-)。真正的答案是两种答案(你的和我的)的混合。您的来自EDT外部的定时呼叫,以及我的getSize()问题 Regards, –

1

记住paint(Graphics)事件调度线程这样睡觉会冻结整个UI上。您需要使用异步重新绘制这样的:

public void init(){ 
    Timer t=new Timer(70, new ActionListener(){ 
     public void actionPerformed(ActionEvent e){repaint();} 
    }); 
    t.setCoalesce(true); 
    t.setRepeats(true); 
    t.start(); 
} 
public void paint(Graphics g){...} 
+0

是的,我没有完全阅读这个问题,对不起。尽管如此,这仍然是最佳做法。 – DankMemes

1
public void paint(Graphics g) 
{ 
    // .. 

应该是:

public void paint(Graphics g) 
{ 
    super.paint(g); // VERY IMPORTANT! Draw BG and borders etc. 
    // ..