| |
, 200, 200, this);
// Рисуем нормальное изображение флоппи-диска
g.drawImage(FloppyDiskImg, 25, 3, this);
// Рисуем нормальное изображение компакт-диска
g.drawImage(CDDiskImg , 70, 3, this);
// Рисуем вытянутое изображение компакт-диска
g.drawImage(CDDiskImg , 115, 3, 40, 25, this);
}
}
Листинг 4.2 содержит исходный текст документа HTML, созданный для нашего
аплета автоматически системой Microsoft Visual J++.
Листинг 4.2. Файл ImageDraw\ImageDraw.html
ImageDraw
The source.
Описание исходных текстов
В главном классе нашего аплета определено два поля и несколько методов.
Рассмотрим эти поля и самые важные методы.
Поля класса ImageDraw
В классе ImageDraw определено два поля:
Image FloppyDiskImg;
Image CDDiskImg;
В первом из них хранится ссылка на изображение флоппи-диска, во втором -
ссылка на изображение компакт-диска.
Метод init
Метод init создает два объекта класса Image для файлов disk.gif и cd.gif:
FloppyDiskImg = getImage(getCodeBase(), "disk.gif");
CDDiskImg = getImage(getCodeBase(), "cd.gif");
В качестве первого параметра методу getImage передается адрес URL аплета,
полученный при помощи метода getCodeBase. При этом предполагается, что файлы
disk.gif и cd.gif находятся в том же каталоге, что и аплет.
Метод paint
После раскрашивания окна аплета в белый цвет и рисования вокруг окна черной
рамки метод paint вызывает четыре раза метод drawImage, рисуя изображения
флоппи-диска и компакт-диска:
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);
В первый раз флоппи-диск рисуется с масштабированием, во второй раз - в
исходном виде. Компакт-диск вначале рисуется в исходном виде, а затем -
растянутым по горизонтали.
Ожидание загрузки изображений
Как мы уже говорили, загрузка изображений из сети Internet - длительный
процесс, который в среднем идет со скоростью 1 Кбайт в секунду. Поэтому
изображения загружаются навигатором в отдельной задаче. При этом метод getImage
только создает объект класса Image, а метод drawImage инициирует загрузку
изображения и рисует его. Причем если файл изображения имеет большую длину, он
будет появляться в окне аплета постепенно по мере загрузки.
Однако в некоторых случаях было бы удобно вначале загрузить изображение
полностью, а лишь затем выполнять рисование, чтобы изображение появилось на
экране сразу. Кроме того, аплет может рисовать сразу несколько изображений в
разных местах своего окна или показывать их по очереди в одном и том же месте
для достижения эффекта анимации.
Есть ли способ определить, когда изображение будет загружено полностью?
Есть, и причем целых два. Один из них связан с использованием класса
MediaTracker, специально предназначенного для этой цели и достаточно удобного в
использовании, другой основан на переопределении одного из методов интерфейса
ImageObserver.
Применение класса MediaTracker
Для того чтобы выполнить ожидание загрузки нескольких изображений, проще
воспользоваться классом MediaTracker, а не интерфейсом ImageObserver.
Как это сделать?
Обычно метод init аплета создает объект класса MediaTracker с помощью
конструктора и добавляет в него все изображения, загрузки которых необходимо
дождаться.
Создание объекта класса MediaTracker
Объект класса MediaTracker создается следующим образом:
MediaTracker mt;
mt = new MediaTracker(this);
Конструктору класса MediaTracker передается ссылка на компонент, для
которого необходимо отслеживать загрузку изображений. В данном случае это наш
аплет, поэтому мы передаем конструктору значение this.
Добавление изображений в объект класса MediaTracker
Далее метод init должен создать все необходимые объекты класса Image и
добавить их в объект MediaTracker методом addImage. Ниже мы показали фра
|
|