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

Загрузка изображений
(ImageLoader.java)

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

import java.awt.*;
import java.applet.*;

/*
  Класс ICanvas - потомок Canvas
  Он просто рисует изображение, используя свой графический контекст.
  Рисуя изображение , в методе drawImage указывается класс, который
  реализует интерфейс ImageObserver , т.е. отслеживает процесс
  загрузки изображения через свой метод imageUpdate
*/
public class ICanvas extends Canvas { 
  Image image;
  Applet parent;
  
  ICanvas(Image img,Applet prnt ) {
    image = img;
    parent = prnt;
  }
  public void paint(Graphics g) {
    g.drawImage(image,0,0,parent);
  }
  public void update (Graphics g) {
    paint(g);
  }
  
}

ImageLoader.java

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

/*
  ImageLoader - главный класс приложения
  Потомок класса Applet, реализует интерфейс ImageObserver , т.е.
  содержит метод imageUpdate , который отслеживает загрузку изображения
*/
public class ImageLoader extends Applet implements ImageObserver
{
  
  Image image;
  int imageHeight = 0;
  ICanvas imageCanvas; 
  ProgressBar progressCanvas;
  Label progressLabel;

  /*
    В методе init происходит инициализация апплета :
    getImage запрашивает example.gif с сервера ;
    компонуется экранная форма .
  */
  public void init () { 
    
    image = getImage(getDocumentBase(),"example.gif");

    progressCanvas = new ProgressBar();
    progressLabel = new Label("0%");
    imageCanvas = new ICanvas (image,this);

    Panel progressPanel = new Panel ();
    progressPanel.setLayout(new BorderLayout());
    progressPanel.add("West",new Label("Loading:",Label.RIGHT));
    progressPanel.add("Center",progressCanvas);
    progressPanel.add("East",progressLabel);
    
    
    setLayout(new BorderLayout());
    add("South",progressPanel);
    add("Center",imageCanvas);
  }

  /*
    Во время загрузки изображения вызывается метод updateImage каждый раз,
    когда приходит новая порция данных.
    Параметр flags сообщает о состоянии загрузки на данный момент
    (загружена новая порция изображения , изображение полностью
    загружено , загрузка прекращена из-за ошибки и т.д.).
  */
  public boolean imageUpdate (Image img, int flags, int x, int y, int w, int h) 
  {
    if ((flags ? SOMEBITS) != 0) 
    { // Если загружена новая порция ..
      if (imageHeight == 0)        // Если мы еще не узнали высоту
                                  //  всего изображения...
        imageHeight = img.getHeight(this); // ...то запоминаем ее
      if (imageHeight != 0) 
      {
        int loaded = (y+h)*100/imageHeight; //вычисляется процент загруженной
                                            //части
        progressLabel.setText( Integer.toString(loaded)+"%"); 
        progressCanvas.setLoaded(loaded);
        imageCanvas.repaint(x,y,w,h);
      }
    } 
    else 
      if ((flags ? ABORT ) != 0) 
      { // Если загрузка прервана , то завершаем
                                   // работу
        System.out.println("Can't get iamge.");
        System.exit(1);
      };
    return ((flags ? (ALLBITS | ABORT)) == 0 );
}

ProgressBar.java

import java.awt.*;

/*
  Класс ProgressBar является потомком класса Canvas.
  Метод setLoaded записывает в переменную loaded количество
  подгруженного изображения в процентах ( от 0 до 100 )
  А метод paint рисует прямоугольник, длина которого зависит от loaded
*/
public class ProgressBar extends Canvas {
  
  int loaded = 0;

  public void setLoaded(int t) {
    loaded = t;
    repaint();
  }
  public void paint(Graphics g) {
    g.setColor(Color.blue);
    Dimension dim = size();
    g.drawRect(1,1,dim.width-2,dim.height-2);
    g.fillRect(5,5,loaded*(dim.width-10)/100,dim.height-10);
  }
  public void update(Graphics g) {
    paint(g);
  }
}


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