- Java code
import java.awt.Color;import java.awt.Graphics;import javax.swing.JFrame;public class cricle extends JFrame { int x=80,y=80; public void launch(){ //setLocation(400, 300); setSize(700,800); setLocationRelativeTo(null); //jframe居中显示 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); //jframe不可改变大小 setBackground(Color.YELLOW); setVisible(true); Thread t=new Thread(new RunTank()); t.start(); } //画物体 public void paint(Graphics g){ Color c=g.getColor(); g.setColor(Color.red); g.fillOval(x,y, 40, 40); g.setColor(c); y+=50; } //物体运动 class RunTank implements Runnable{ public void run() { while(true) { repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { cricle tan= new cricle(); tan.launch(); } }
我是想实现一个物体的运动,模拟游戏人物的走动效果。
在这段代码中为什么这个物体之前的运动轨迹都会留下来?
------解决方案--------------------
重写paint方法的时候记得添加 super.paint(g);
public void paint(Graphics g){
super.paint(g);
.........................
}
就ok了。
------解决方案--------------------
都不是!
那是因为Frame是属于awt的容器组件,第一他不适合用来做绘图,因为它是从Component这个祖先派生而来,做了许多改进。第二是因为awt包的组件都没有实现双缓冲,要实现动画,必须覆盖update方法,将这个方法体重写成:
public void update(Graphics g){
g.setColor(getBackground());
g.fillRect(getSize().getWidth(),getSize().getHeight());
g.setColor(getForeground());
paint(g);
}
但有种更方便的做法,即使用swing包中的组件,因为这个包中的组件都实现了双缓冲。即改刷屏为贴图,可小小防止画面闪烁现象。
但面板就不要使用JFrame了,而是使用JComponent,这个组件虽然很原始,但希望你多研究研究,很有来头的!搞懂了这个组件,Java中的所有组件是怎么来的,他们的设计思想怎样的,都会明朗。