Примеры программирования на Java

Анимация
(Anim.java)

Описание апплета
Пример работы апплета

import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;

public class Anim extends Applet implements Runnable {
  Image img[],imgSource;
  MediaTracker mt;
  Color bgColor;
  Thread motor;
  int numIm,curIm;
  int delay;

  /*
    В методе init происходит первичная инициализация апплета .
    Пытаемся считать параметры BGCOLOR, DELAY, IMAGE и FRAMENUM;
    если какой-то из параметров не найден, величине присваиваем
    значение по умолчанию, правда это не относится к IMAGE ( имя файла
    с картинкой ), если нет картинки, то зачем дальше продолжать?
    Нужно еще зарезервировать массив, в который будем заносить
    созданные изображения
  */
  public void init () {
    mt = new MediaTracker (this);
    String imgNameParam = getParameter("IMAGE");
    String delayParam = getParameter("DELAY");
    String bgColorParam = getParameter("BGCOLOR");
    String imgNumParam = getParameter("FRAMENUM");
    if (imgNumParam == null ) {
      System.out.println("Can't get FRAMENUM. Use default (10 frames).");
      numIm = 10;
    } else {
      try {
        numIm = Integer.parseInt(imgNumParam);
      } catch (NumberFormatException e) {
        System.out.println("Can't get FRAMENUM. Use default (10 frames).");
        numIm = 10;
      }
    }
    if (bgColorParam == null ) {
      System.out.println("Can't get BGCOLOR. Use default (white).");
      bgColorParam = "255,255,255";
    }
    StringTokenizer st = new StringTokenizer(bgColorParam,",");
    if ( st.countTokens() != 3 ) {
      System.out.println("Can't get BGCOLOR. Use default (white).");
      bgColor = new Color(255,255,255);
    } else {
      try {
        bgColor = new Color(Integer.parseInt(st.nextToken()),
                            Integer.parseInt(st.nextToken()),
                            Integer.parseInt(st.nextToken()));
      } catch (NumberFormatException e) {
        System.out.println("Can't get BGCOLOR. Use default (white).");
        bgColor = new Color(255,255,255);
      }
    }
    if (delayParam == null) {
      System.out.println("Can't get DELAY. Use default (100 ms).");
      delayParam = "100";
    }
    try {
      delay = Integer.parseInt(delayParam);
    } catch (NumberFormatException e) {
      System.out.println("Can't get DELAY. Use default (100 ms).");
      delayParam = "100";
    }
    if (imgNameParam == null ) {
      System.err.println("Can't get image name. Exit.");
      System.exit(1);
    }
    
    imgSource = getImage(getDocumentBase(),imgNameParam);
    mt.addImage(imgSource,0);
    img = new Image[numIm];
    curIm=0;
    img[curIm]=imgSource;
    setBackground(bgColor);
  }
  /* 
     Метод paint рисует текущий кадр 
  */
  public void paint (Graphics g) {
    if(img[curIm]!=null)
      g.drawImage(img[curIm],0,0,this);
  }

 
  public void update (Graphics g) {
    paint(g);
  }
 
  public void start() {
    if (motor == null) {
      motor = new Thread (this);
      motor.start();
    }
  }

  public void stop () {
    if (motor != null) 
      motor.stop();
  }

  /*
    В методе run создаются все кадры посредством вызова
    метода createRotatedImage (Image sourceImage , double alpha),
    где sourceImage - исходное изображение, которое потом будет вращаться;
        alpha - угол поворота в радианах, изменяется от 0 до 2*PI
    
    Затем приложение входит в беконечный цикл, выводя на экран 
    последовательно картинки из созданного массива img[] с задержкой
    delay (мс).
  */
  public void run() {
    Runtime r = Runtime.getRuntime();
    try {
      mt.waitForAll();
    } catch (Exception e) {
      System.out.println("Interrupted image loading!.");
      System.exit(1);
    }
    double i=0;
    for(int j=0;j?numIm;j++) {
      i+=2*Math.PI/numIm;
      showStatus("Producing the image # "+j);
      img[j] = createRotatedImage(imgSource,i);
      r.gc(); 
      repaint();
    }
    showStatus("");
    while (true) {
      for (curIm=0;curIm?numIm;curIm++) {
        repaint();
        try {
          Thread.sleep(delay);
        } catch(Exception e) {};
      }
      r.gc(); // Поскольку в подобных циклах постоянно накапливается
      // мусор (неиспользуемые уже объекты классов),
      // то необходимо периодически этот мусор удалять,
      // но некоторые реализации виртуальной машины Java забывают
      // иногда делать это,
      // по этому приходится принудительно заставлять их запустить
      // сборщик мусора,
      // чтобы избежать переполнения памяти 
    }
  }
  
  /*
    createRotatedImage получает исходное изображение и угол поворота,
    а возвращает изображение, повернутое на этот угол относительно
    оси OY
  */
  public Image createRotatedImage(Image img,double a) {
    int w = img.getWidth(this);
    int h = img.getHeight(this);
    int [] pixels = new int[w*h];
    int [] pixels2 = new int[w*h];
    PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,w);
    try {
      pg.grabPixels();
    } catch (InterruptedException e) {
      System.err.println("interrupted waiting for pixels!");
      System.exit(1);
    }
    int size=w*h;
    int color = bgColor.getRGB();
    for(int i=0;i?size;i++)
      pixels2[i]=color;

    int x;
    for (int i=0; i?w; i++) {
      x = w/2-(int)Math.round((w/2-i)*Math.cos(a));
      if(x?0) x=0;
      if(x?=w) x=w-1;
      for (int j=0; j?h; j++) 
        pixels2[j*w+x]=pixels[j*w+i];
    }
    MemoryImageSource source = new MemoryImageSource(w,h,pixels2,0,w);
    Image img2 = createImage(source);
    mt.addImage(img2,1);
    try {
      mt.waitForID(1);
    } catch (Exception e) {
      System.err.println("Interrapted.");
      System.exit(1);
    }
    return img2;
  }
}  


Вступление | Примеры | Вопросы
Sun Microsystems
JavaSoft