怎么改动画都是闪 是不是我的写的代码有问题啊import java.awt.*; 
import java.lang.Math;  
import java.applet.*; public class e3 extends Applet implements Runnable 

int []x=new int[10]; 
int []y=new int[10]; 
double []degree=new double[10];  //计算圆形运动轨迹要用到的变量
Thread []planet=new Thread[10]; 
Graphics []plantcolor=new Graphics[10]; 
Image offScreenImg; //存放备用屏幕的内容 
Graphics offScreenG; //备用屏幕的绘图上下文环境 
/***********************************/
public void init() 

for(int i=0;i<9;i++) 

x[i]=-1000; 
y[i]=-1000; 
planet[i]= new Thread(this); 
plantcolor[i]=getGraphics(); 

this.setSize(600, 600); 
offScreenImg=createImage(600,600);//创建备用屏幕 
offScreenG = offScreenImg.getGraphics (); //获取备用屏幕的绘图上下文环境 

/***************start()2个线程管理2个球的运动********************/
public void start() 

planet[0].start();             
planet[1].start(); 

/****************stop()*******************/
public void stop() 

// planet[0] = null; 

/****************paint(Graphics g) *******************/
public void paint(Graphics g) 

plantcolor[0].drawImage(offScreenImg,0,0,this); 
plantcolor[1].drawImage(offScreenImg,0,0,this); 
    plantcolor[0].fillOval(x[0],y[0], 30, 30); 
    plantcolor[1].fillOval(x[1],y[1], 30, 30); 

/****************update(Graphics g) *******************/public void update(Graphics g) 

if(offScreenImg==null ||offScreenImg.getWidth(null)!=getSize().width ||offScreenImg.getHeight(null)!=getSize().height) 

offScreenImg=createImage(600,600); 

// System.out.print(" ");   // 如果不注释掉这句. 动画就稍微不会那么闪,为什么呀?paint(plantcolor[0]); 
paint(plantcolor[1]); 
} /***************run() 圆周运动********************/
public void run() 

while(true) 

if(Thread.currentThread()==planet[0])        //第  1 个圆形

x[0]=(int)(100*Math.cos(degree[0])+200);    //计算轨迹横坐标
y[0]=(int)(60*Math.sin(degree[0])+200);     //计算轨迹纵坐标 
degree[0]=degree[0]+(Math.PI/100);          //计算圆形运动轨迹要用到的变量
try{planet[0].sleep(10);} 
catch(InterruptedException E){} 
repaint(); 

else if(Thread.currentThread()==planet[1])    //第  2 个圆形

x[1]=(int)(70*Math.cos(degree[1])+200); 
y[1]=(int)(50*Math.sin(degree[1])+200); 
degree[1]=degree[1]+(Math.PI/200); 
try{planet[1].sleep(10);} 
catch(InterruptedException E){} 
repaint(); 
} } } 
}

解决方案 »

  1.   

    Applet????
    还是研究点别的吧
      

  2.   

    看了一下你的源码,个人认为你这样做本身就不好。
    打个比方,想想以前那种老式的屏幕电影,前面有块白布,后面有放映机的那种,
    您的做法是想起来挺逗的那种:-)
    哥们您不是将影片从放映机上投在白布上,
    而是......
    您准备了N多个画好内容的大白布。在观众的面前不停换您那N多张有内容大白布。
    不是一般的累呀!!您说他能不闪吗?
    以上只是个人看法。
    以你的例子来说,你现在要画二个球的运动,
    你的做法是不停的重画整个Applet。
    下面是我随便改了改的东西。
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */package javabean;import java.awt.Color;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Point;
    import javax.swing.BoxLayout;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    class Area extends javax.swing.JComponent{
    java.awt.Image offScreenImg=createImage(600,600);; //存放备用屏幕的内容
    int []x=new int[10];
    int []y=new int[10];
    double []degree=new double[10];
    public Area() {
        for(int i=0;i <9;i++)
        {
            x[i]=-1000;
            y[i]=-1000;
        }
    //setOpaque(true);
    }public void paint(Graphics g) {
    //if (isOpaque()) {
    //g.setColor(getBackground());
    //g.fillRect(getX(), getY(), getWidth(), getHeight());
    //}
        x[0]=(int)(100*Math.cos(degree[0])+200);    //计算轨迹横坐标
        y[0]=(int)(60*Math.sin(degree[0])+200);    //计算轨迹纵坐标
        degree[0]=degree[0]+(Math.PI/100);          //计算圆形运动轨迹要用到的变量
    //try{planet[0].sleep(10);}
    //catch(InterruptedException E){}
    //repaint();
            x[1]=(int)(70*Math.cos(degree[1])+200);
        y[1]=(int)(50*Math.sin(degree[1])+200);
        degree[1]=degree[1]+(Math.PI/200);
        
        g.drawImage(offScreenImg,0,0,this);
        g.drawImage(offScreenImg,0,0,this);
        g.fillOval(x[0],y[0], 30, 30);
        g.fillOval(x[1],y[1], 30, 30);
        
    }
    public void doTask(){
    new Thread(){
    public void run(){
    while (true){
    try{
      this.sleep(50);
      Area.this.repaint();
      }catch(Exception e){  }
      }
      }
      }.start();
    }
    }
    public class Test {  Area area = new Area();
      private void buildUI(Container container) {
        container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
        container.add(area);
        area.setAlignmentX(Component.LEFT_ALIGNMENT);
        area.doTask();
      }  public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.setPreferredSize(new Dimension(300,500));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Test controller = new Test();
        controller.buildUI(frame.getContentPane());
        frame.pack();
        frame.setVisible(true);
      }}