Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

3.4 Двойная буферизация графического изображения

Для ускорения вывода картинок на экран и для устранения эффекта мерцания изображений в процессе вывода большинство апплетов использует двойную буферизацию изображения - сначала загружая изображение в оперативную память, а затем выводя его в окне апплета за один шаг.

Для того, чтобы использовать двойную буферизацию, апплет должен включать в себя метод imageUpdate(), которую он использует для контроля над тем, какую часть картинки метод drawImage() загрузил в память. После того, как все изображение оказывается в памяти, программа может выводить его быстро, без искажений, которые возникают при одновременной загрузке изображения и выводе его на экран.

Создадим шаблон апплета QuickPicture (пример 6) на основе шаблонов из Приложения 1 (или при помощи системы Java Applet Wizard). В каталог, где содержится файл исходного текста, следует поместить файл с изображением sample.gif.

В классе апплета объявить переменные:

Image pic; // изображение из файла

boolean picLoaded=false; // было ли полностью загружено изображение

В методе init() класса апплета загрузить графическое изображение pic из файла, затем создать пустое изображение offScreenImage -нечто вроде виртуального экрана в памяти, получить графический контекст этого “экрана”, в который затем вывести изображение pic:

try

{ pic=getImage(new java.net.URL(getCodeBase(),"sample.gif"));

}

catch(java.net.MalformedURLException e)

{ // код здесь выполняется, если строка URL неправильна

pic=createImage(0,0); // создание пустого изображения

}

// создание виртуального экрана

Image offScreenImage=createImage(size().width,size().height);

// получение его контекста

Graphics offScreenGraphics= offScreenImage.getGraphics();

// вывод изображения на виртуальный экран

offScreenGraphics.drawImage(pic,0,0,this);

В данном случае, так как программа выводит постепенно загружающееся изображение не на реальный экран, а в память, в окне апплета ничего не появляется.

Каждый раз, когда апплет вызывает метод drawImage(), он создает поток, вызывающий метод imageUpdate(), который можно переопределить в классе апплета и использовать для того, чтобы определить, какая часть изображения загружена в память. Поток, созданный метод drawImage(), вызывает метод imageUpdate() до тех пор, пока он возвращает true.

Переопределим в классе апплета метод imageUpdate():

public boolean imageUpdate(Image img,int infoflags,int x,int y,int w,int h)

{ if(infoflags==ALLBITS)

{ // изображение загружено полностью

picLoaded=true;

repaint();// перерисовать окно апплета

// больше метод imageUpdate не вызывать

return false;

}

return true; // изображение загружено в память не полностью

}

Параметр infoflags этого метода позволяет отследить, какая часть изображения загружена в память (есть несколько определенных состояний этого флага). Когда этот параметр равен ALLBITS, это означает, что это изображение полностью находится в памяти.

Переменная picLoaded используется в методе paint(). Когда она принимает значение true, то изображение pic (загруженное уже полностью), выводится в окно апплета:

public void paint (Graphics g)

{ if(picLoaded)

{ // четвертым параметром передается null,

// он не позволяет функции drawImage() вызывать

// метод imageUpdate() в процессе вывода

g.drawImage(pic,0,0,null);

// сообщение в панель состояния

showStatus("Done");

}

else

{ // сообщение в панель состояния

showStatus("Loading image");

}

}

Так как изображение теперь находится в памяти, оно тотчас появляется в окне апплета.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]