我正在编写一个小型JAVA小程序。
它获得1到6之间的随机数并打印出来 APPLET屏幕。 我想要做的是..在屏幕上循环50次并打印各种randdom数字。 [每次清除前一个号码]。
在那个循环之后..它在applet上打印任何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){}
}
}
}
答案 0 :(得分:1)
问题是,在对象创建时,applet没有大小,所以你必须等待获得applet的维度。例如,在渲染时,如下所示:
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){}
}
}
答案 1 :(得分: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){...}
答案 2 :(得分:1)
public void paint(Graphics g)
{
// ..
应该是:
public void paint(Graphics g)
{
super.paint(g); // VERY IMPORTANT! Draw BG and borders etc.
// ..