Двойная буферизация
Любое изображение можно загрузить сначала в буфер, а затем, когда загрузка завершена, перегрузить в область вывода.
Эта перегрузка выполняется мгновенно, и пользователь не должен наблюдать долгую и нудную загрузку изображения по частям.
Пока идет загрузка, можно развлечь пользователя музыкой, глупыми вопросами. Можно на диаграмме показать, как идет процесс загрузки, сколько процентов осталось.
Размеры выводимого в данном разделе апплета - 300 x 430. Следовательно, изображение, которое мы будем вводить в область за пределами этого участка, будет для нас невидимо. Когда ввод изображения закончится, перегрузим его в видимую область.
При этом мы будем следить за ходом загрузки изображения с помощью метода imageUpdate .
Флаг SOMEBITS устанавливается при загрузке очередной порции изображения. При этом мы вычисляем и выводим на экран процент загрузки и диаграмму.
По концу загрузки устанавливается флаг ALLBITS и мы , используя логическую переменную ImageLoaded , сообщаем методу paint о необходимости вывода на экран уже готового изображения.
//------------------------------------------------------------
// Program : MyThirdImage
//------------------------------------------------------------
// Author : Katz Yakov
//------------------------------------------------------------
// Date : 25/01/98
//------------------------------------------------------------
import java.awt.*;
import java.applet.*;
//------------------------------------------------------------
// Создание апплета MyThirdImage
public class MyThirdImage extends Applet{
// Переменная для вычисления процента загрузки
int persent;
// Размеры апплета - для создания изображения
// за его пределами
int XMax = 300;
int YMax = 430;
// Обьявление переменной для создания фонта
// для вывода изображения на экран
Font font1;
// Логическая переменная указывает, завершена
// ли загрузка изображения
boolean ImageLoaded = false;
// Переменная типа класса Image служит для
// загрузки в нее изображения
Image picture;
// Действия при загрузке апплета
public void init() {
// Создание нового фонта
font1 = new Font("TimesRoman",Font.BOLD,18);
// Начальное значение процента загрузки изображения
persent = 0;
// Присваивание графического файла обьекту
picture = getImage(getCodeBase(),"SHISHKIN.JPG");
// Создание нового обьекта, которому присваивается
// графический контекст изображения вне экрана
Image offScreenImage = createImage(XMax, YMax);
Graphics grGraph = offScreenImage.getGraphics();
// Вывод изображения в новом графическом контексте
// за пределами экрана
grGraph.drawImage(picture, 0, 0, this);
}
// Использование контролера загрузки изображения
public boolean imageUpdate(Image img, int flags,
int x, int y, int w, int h) {
// Загружена очередная порция изображения
if ((flags & SOMEBITS) != 0) {
// Вычисление нового процента загрузки
persent = (y + h) * 100 / YMax;
// Вызов перерисовки изображения
repaint();
return true;
}
// Завершена загрузка изображения
if ((flags & ALLBITS) != 0) {
// Установка значения логической переменной
ImageLoaded = true;
// Вызов перерисовки изображения
repaint();
return true;
}
return false;
}
// Перерисовка изображения
public void paint(Graphics gr) {
// Установка нового фонта
gr.setFont(font1);
// Создание картинки изображения в апплете до
// загрузки изображения
gr.setColor(Color.yellow);
gr.fillRect(0, 0, 300, 430);
gr.setColor(Color.navy);
gr.fillRect(40, 20, 220, 40);
gr.setColor(Color.white);
gr.fillRect(50, 30, 200, 20);
gr.setColor(Color.black);
gr.drawString("Идет загрузка: %", 40, 80);
// Запись всяких глупых вопросов,
// чтобы пользователь чем-то занялся
// до завершения загрузки изображения
gr.drawString("What greater : 3**7 or 7**3 ?", 20, 140);
gr.drawString("Who stronger : elephant or whale ?", 20, 180);
gr.drawString("Что больше : 3**7 или 7**3 ?", 20, 220);
gr.drawString("Кто сильнее : слон или кит ?", 20, 260);
// Если загрузеа изображения завершена,
// то вывести его в апплет
if (ImageLoaded) {
gr.drawImage(picture, 0, 0, this);
}
// Если загрузеа изображения не завершена,
// то вывести в апплет процент загрузки
else {
gr.setColor(Color.maroon);
gr.fillRect(50, 30, 2 * persent, 20);
gr.setColor(Color.yellow);
gr.fillRect(180, 80, 40, 20);
gr.setColor(Color.navy);
gr.drawString(" " + persent , 180, 80);
}
}
}
При выводе апплета на моем компьютере есть следующие отличия в работе браузеров:
- Explorer правильно отображает кодировку русского текста, Netscape выводит неправильно,
- С другой стороны, Netscape нормально загружает изображение, а
Explorer его вообще не загружает.
В общем, если бы к носу Парфирия Ивановича приставить губы Аграфены Кузьминичны...
А ведь в браузере JAVA все нормально...
Хочется плакать...
Я надеюсь, что это связано с особенностями моего компьютера, и у других все выглядит отлично... Напишите, пожалуйста.
Апплет выглядит следующим образом: