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