日期:2014-05-20  浏览次数:20836 次

模拟物体运动效果时在哪出了问题?(求解)
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中的所有组件是怎么来的,他们的设计思想怎样的,都会明朗。