当前位置: 代码迷 >> J2SE >> 模拟物体运动效果时在哪出了有关问题?(求解)
  详细解决方案

模拟物体运动效果时在哪出了有关问题?(求解)

热度:148   发布时间:2016-04-24 01:48:59.0
模拟物体运动效果时在哪出了问题?(求解)
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中的所有组件是怎么来的,他们的设计思想怎样的,都会明朗。
  相关解决方案