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

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

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

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

Приложение ImageDrawWait

В приложении ImageDrawWait мы демонстрируем использование класса MediaTracker для ожидания процесса завершения загрузки изображений, показанных на рис. 4.1. Эти изображения рисуются приложением ImageDrawWait не на белом фоне, а на фоне другого изображения.

Файл изображение фона имеет значительный размер, поэтому без применения техники ожидания завершения загрузки он будет появляться в окне по частям (именно так работает метод imageUpdate, определенный в классе Applet), а затем будут нарисованы остальные изображения. Наше приложение сначала дожидается завершения загрузки всех изображений, а затем рисует их, поэтому все изображения появятся практически одновременно и целиком.

В процессе загрузки окно приложения ImageDrawWait отображает сообщение о ходе загрузки (рис. 4.2).

Рис. 4.2. Сообщение о ходе процесса загрузки изображений

После загрузки в окне аплета рисуется изображение фона

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

Исходные тексты приложения ImageDrawWait вы найдете в листинге 4.3.

Листинг 4.3. Файл ImageDrawWait\ImageDrawWait.java


// =========================================================
// Рисование растровых изображений с ожиданием их загрузки
//
// (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 ImageDrawWait extends Applet
{
  // Фоновое изображение
  Image BkgImg;
  
  // Изображение флоппи-диска
  Image FloppyDiskImg;

  // Изображение компакт-диска
  Image CDDiskImg;

  // Ссылка на MediaTracker
  MediaTracker mt;

  // -------------------------------------------------------
  // getAppletInfo
  // Метод, возвращающей строку информации об аплете
  // -------------------------------------------------------
  public String getAppletInfo()
  {
    return "Name: ImageDrawWait\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()
  {
    // Создаем объект класса MediaTracker
    mt = new MediaTracker(this);

    // Загружаем фоновое изображение
    BkgImg = getImage(getCodeBase(), "bkg.gif");
    
    // Добавляем его в список объекта MediaTracker
    mt.addImage(BkgImg , 0);

    // Загружаем изображение флоппи-диска
    FloppyDiskImg = getImage(getCodeBase(), "disk.gif");

    // Добавляем его в список объекта MediaTracker
    mt.addImage(FloppyDiskImg, 0);

    // Загружаем изображение флоппи-диска
    CDDiskImg = getImage(getCodeBase(), "cd.gif");

    // Добавляем его в список объекта MediaTracker
    mt.addImage(CDDiskImg, 0);
  }

  // -------------------------------------------------------
  // 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);

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

    // Ждем, пока все изображения не будут загружены
    try
    {
      mt.waitForAll();
    }
    catch (InterruptedException ex)
    {
    }

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

    // Рисуем увеличенное изображение флоппи-диска
    g.drawImage(FloppyDiskImg, 25, 42, 200, 200, this);

    // Рисуем нормальное изображение флоппи-диска
    g.drawImage(FloppyDiskImg, 25, 3, this);

    // Рисуем нормальное изображение компакт-диска
    g.drawImage(CDDiskImg , 70, 3, this);

    // Рисуем вытянутое изображение компакт-диска
    g.drawImage(CDDiskImg , 115, 3, 40, 25, this);
  }
}

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

Листинг 4.4. Файл ImageDrawWait\ImageDrawWait.html


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

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

Опишем наиболее важные методы приложения ImageDrawWait.

Метод init

Прежде всего метод init создает объект класса MediaTracker, который будет использоваться для отслеживания процесса загрузки изображений:


mt = new MediaTracker(this);

Далее метод init последовательно создает три объекта класса Image (соответственно, для изображений фона, для флоппи-диска и для компакт-диска), а затем добавляет их в объект MediaTracker с помощью метода addImage:


BkgImg = getImage(getCodeBase(), "bkg.gif");
mt.addImage(BkgImg , 0);

FloppyDiskImg = getImage(getCodeBase(), "disk.gif");
mt.addImage(FloppyDiskImg, 0);

CDDiskImg = getImage(getCodeBase(), "cd.gif");
mt.addImage(CDDiskImg, 0);

Метод paint

Метод paint прежде всего раскрашивает окно аплета в белый цвет и обводит его черной рамкой. Затем на подготовленной таким образом поверхности он пишет сообщение о начале процесса загрузки изображений:


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

Далее ожидается загрузка всех изображений, для чего вызывается метод waitForAll из класса MediaTracker:


try
{
  mt.waitForAll();
}
catch (InterruptedException ex)
{
}

Когда все изображения будут загружены, следует серия вызовов метода drawImage, с помощью которых рисуется изображение фона, два изображения флоппи-диска и два изображения компакт-диска:


g.drawImage(BkgImg, 1, 1, 
  dimAppWndDimension.width  - 2, 
  dimAppWndDimension.height - 2, this);
g.drawImage(FloppyDiskImg, 25, 42, 200, 200, this);
g.drawImage(FloppyDiskImg, 25, 3, this);
g.drawImage(CDDiskImg , 70, 3, this);
g.drawImage(CDDiskImg , 115, 3, 40, 25, this);
[Назад] [Содеожание] [Дальше]