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


