比如我想做一个小动画,让球在移动。用paint和线程,不断重画,然后我发现用Frame可以成功实现。但是用JFrame却会出现出现新的球,原来的球还在,即可以看到几个球。。这是为什么
public void paint(Graphics g) {
Color c=g.getColor();
g.setColor(new Color(122,122,123));
g.fillOval(x, y, 50, 50);
g.setColor(c);
y+=50;
}
改成
public void paint(Graphics g) {
super.paint(g);//frame会隐藏清屏,jframe不会清除上一帧动作。
Color c=g.getColor();
g.setColor(new Color(122,122,123));
g.fillOval(x, y, 50, 50);
g.setColor(c);
y+=50;
}
J开头的像JFrame、JButton都是swing下的,Frame、Button都是awt下的,而swing是awt的升级版。
package h1;
import java.awt.Color;
import java.awt.Container;
import java.awt.Frame;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Tank extends JFrame{
public static final int GAME_WIGH=800,GAME_HIGH=600;
int x=30,y=50;
public void paint(Graphics g) {
Color c=g.getColor();
g.setColor(new Color(122,122,123));
g.fillOval(x, y, 50, 50);
g.setColor(c);
y+=50;
}
public void launchFrame(){
setBounds(300, 100, GAME_WIGH, GAME_HIGH);
setVisible(true);
setResizable(false);
setTitle("坦克大战1.0");
Thread thread=new Thread(new TThread());
thread.start();
}
public static void main(String[] args) {
Tank tank=new Tank();
tank.launchFrame();
}
private class TThread implements Runnable {
public void run() {
while(true){
repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
比如这个例子 把Frame改为JFrame会出现不同效果,另外,用JFrame时设置背景颜色再加上paint之后就不管用了 这都是为什么 求指教
之所以会有好几个球是因为线程重画还没有完成,可以设置成在虚拟画布上画出来之后,统一显示在窗口上