Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2

© Александр Фролов, Григорий Фролов
Том 32, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Приложение DrawImageObserver

Приложение DrawImageObserver рисует в своем окне изображение фона, такое же, как и в предыдущем приложении. При этом для ожидания процесса загрузки изображения перед рисованием фона мы используем интерфейс ImageObserver.

Если бы изображение фона, имеющее значительный размер, рисовалось без ожидания его загрузки, оно появлялось бы в окне аплета по частям. Наше приложение рисует его сразу, так как дожидается полной загрузки.

Исходные тексты приложения

Главный файл исходных текстов приложения DrawImageObserver приведен в листинге 4.5.

Листинг 4.5. Файл DrawImageObserver\DrawImageObserver.java


// =========================================================
// Рисование растровых изображений с ожиданием их загрузки
// Для ожидания применяется интерфейс ImageObserver
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.applet.*;
import java.awt.*;

public class DrawImageObserver extends Applet
{
  // Фоновое изображение
  Image BkgImg;
  
  boolean fAllLoaded = false;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: DrawImageObserver\r\n" +
      "Author: Alexandr Frolov\r\n" +
      "E-mail: frolov@glas.apc.org" +
      "WWW:    http://www.glasnet.ru/~frolov" +
      "Created with Microsoft Visual J++ Version 1.0";
  }

  // -------------------------------------------------------
  // init
  // Метод init, получает управление при 
  // инициализации аплета
  // -------------------------------------------------------
  public void init()
  {
    // Загружаем фоновое изображение
    BkgImg = getImage(getCodeBase(), "bkg.gif");
  }

  // -------------------------------------------------------
  // imageUpdate
  // Вызывается, когда появляется информация об изображении
  // -------------------------------------------------------
  public boolean imageUpdate(Image img, int flags,
    int x, int y, int w, int h)
  {
    // Проверяем, все ли изображение загружено
    fAllLoaded = ((flags & ALLBITS) != 0);

    // Если все, перерисовываем окно
    if(fAllLoaded)
      repaint();

    // Если изображение загружено полностью, дальнейшие 
    // вызовы метода imageUpdate не нужны
    return !fAllLoaded;
  }
    
  // -------------------------------------------------------
  // paint
  // Метод paint, выполняющий рисование в окне аплета
  // -------------------------------------------------------
  public void paint(Graphics g)
  {
    // Определяем текущие размеры окна аплета
    Dimension dimAppWndDimension = size();
    
    // Выбираем в контекст отображения белый цвет
    g.setColor(Color.white);
    
    // Закрашиваем внутреннюю область окна аплета
    g.fillRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет
    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета
    g.drawRect(0, 0, 
      dimAppWndDimension.width  - 1, 
      dimAppWndDimension.height - 1);

    if(fAllLoaded == false)
    {
      // Рисуем сообщение о начале загрузки
      g.drawString("Подождите, идет загрузка...",
        20, dimAppWndDimension.height / 2);
    }

    // Рисуем изображение фона
    g.drawImage(BkgImg, 1, 1, 
      dimAppWndDimension.width  - 2, 
      dimAppWndDimension.height - 2, this);
  }
}

В листинге 4.6 вы найдете исходный текст документа HTML, созданного автоматически для нашего аплета.

Листинг 4.6. Файл DrawImageObserver\DrawImageObserver.html


<html>
<head>
<title>DrawImageObserver</title>
</head>
<body>
<hr>
<applet
    code=DrawImageObserver.class
    id=DrawImageObserver
    width=320
    height=240 >
</applet>
<hr>
<a href="DrawImageObserver.java">The source.</a>
</body>
</html>

Описание исходных текстов

Наше приложение переопределяет метод imageUpdate, в котором отслеживает процесс загрузки фонового изображения.

Опишем основные методы, определенные в приложении DrawImageObserver.

Метод init

В процессе инициализации аплета метод init создает объект класса Image, соответствующий изображению фона:


public void init()
{
  BkgImg = getImage(getCodeBase(), "bkg.gif");
}

Как вы уже знаете, при этом реальная загрузка файла изображения не выполняется.

Метод paint

Свою работу метод paint начинает с раскрашивания окна аплета и рисования рамки вокруг окна. Затем метод проверяет флаг fAllLoaded, начальное значение которого равно false:


if(fAllLoaded == false)
{
  g.drawString("Подождите, идет загрузка...",
    20, dimAppWndDimension.height / 2);
}

Флаг fAllLoaded служит индикатором полной загрузки изображения и устанавливается методом imageUpdate, отслеживающим загрузку. Пока значение этого флага равно false, метод paint отображает в окне аплета сообщение о том, что идет процесс загрузки.

Когда изображение будет полностью загружено, метод imageUpdate устанавливает значение флага fAllLoaded, равное true, а затем принудительно перерисовывает окно аплета, вызывая метод repaint. При этом метод paint рисует в окне аплета полностью загруженное изображение фона:


g.drawImage(BkgImg, 1, 1, 
  dimAppWndDimension.width  - 2, 
  dimAppWndDimension.height - 2, this);

Метод imageUpdate

Метод imageUpdate периодически вызывается в процессе загрузки изображения, конструируя каждый раз значение флага полной загрузки fAllLoaded следующим образом:


fAllLoaded = ((flags & ALLBITS) != 0);

Когд изображение будет полностью загружено, в параметре flags метода imageUpdate будет установлен флаг ALLBITS, после чего флаг fAllLoaded будет установлен в значение true.

Как только это произойдет, метод imageUpdate вызовет метод repaint, выполнив принудительную перерисовку окна аплета:


if(fAllLoaded)
  repaint();

При этом метод paint нарисует в окне аплета изображение фона, закрасив им сообщение о ходе процесса загрузки изображения.

Метод imageUpdate должен возвратить значение false или true. Если изображение еще не загружено, возвращается значение true:


return !fAllLoaded;

При этом метод imageUpdate будет вызываться еще раз для отслеживания процесса загрузки.

Когда загрузка будет завершена, метод imageUpdate возвратит значение false, после чего этот метод вызываться больше не будет.

[Назад] [Содеожание] [Дальше]