Подвійна буферизація image

Об'єкти зображення можуть зберігатися в пам'яті комп'ютера. Ці зображення, якщо вони не записані в буфер екрану, не видно користувача. Зображення, які зберігаються в пам'яті комп'ютера, можуть бути дуже швидко скопійовані в буфер екрану і стати видимими. Саме така техніка використовується при малюванні компонентів swing, які надають додаткові можливості для роботи з графікою. Картинка створюється крок за кроком, утворюючи зображення у пам'яті комп'ютера. Цей процес може тривати деякий час. Якби процес малювання відбувався у буфері екрана, користувач зміг би помітити мерехтіння картинки. Зручніше замінити існуючу картинку вже створеною новою картинкою та не малювати її у процесі відображення на екран. Заміна одного зображення іншим готовим зображенням відбувається миттєво. Користувач не помітить мерехтіння, викликаного тим, що зображення створюється в процесі її відображення. При цьому зображення, особливо при використанні анімації, стає гладким.

Як ілюстрацію розглянемо два приклади. Файл DB.java (листинг 1.31) описує червоний квадрат, що перетягується, з використанням техніки подвійної буферизації. не використовується у файлі NonDB.java (листинг 1.30). Другий аплет при перетягуванні квадрата мерехтітиме. Щоб зробити ефект мерехтіння помітнішим, фон містить безліч сірих горизонтальних ліній, це збільшує час промальовування, робить мерехтіння сильно помітним.

Лістинг 1.30. Файл NonDB.java

подвійна буферизація відсутня

impo гt j ava.awt.*; impo rt j ava.awt.event.*; import javax.swing. *; public class NonDB extends JApplet < public void init() < setContentPane(new Display());

class Display extends JPanel implements MouseListener, MouseMotionListener < int xl, yl; boolean dragging; intзсувX, зміщенняY; Показати ( ) < ; xl = 10; yl = 10;

setBackground (Колір. білий); addMouseListener(це) ; addMouseMotionListener(це); setDoubleBuffered (false);

for ( int i = 3 ; i = xl & x = yl & у getSize ( ).width –

II yl + 50 getSize().height – 3) < xl = 10; yl = 10;

public void mouseDragged( MouseEvent якщо є);

if ( перетягування == false )

int x = необов'язковий. getX() ; // за замовчуванням int у = if.getY();

xl = x — зміщення X; // Зсув yl = у — зміщенняY;

public void mouseMoved( MouseEvent якщо можливо) < >public void mouseClicked(MouseEvent якщо можливо) < >public void mouseEntered(MouseEvent якщо є);

public void mouseExited (MouseEvent якщо є) < >>

Лістинг 1.31. Видаліть DB.java

используется двойная буферизация

impo гt j ava.awt.*; impo rt j avail.awt.event.*; імпорт javax.swing. *; відкритий клас БД розширює JApplet < public void init()

клас Display розширює JPanel, реалізує MouseListener , MouseMotionListener < ; int xl, yl; логічне перетягування; int offsetX, offsetY; Показати ( ) < ; xl = 10; yl = 10;

setBackground (Колір. білий); addMouseListener(це) ; addMouseMotionListener(це);

II yl + 50 getSize().height – 3) < xl = 10; yl = 10;

public void mouseDragged( MouseEvent якщо є);

if ( перетягування == false )

int x = необов'язковий. getX() ; int у = if .getY(); xl = x — зміщення X; yl = у — зміщенняY;

public void mouseMoved( MouseEvent якщо можливо) < >public void mouseClicked(MouseEvent якщо можливо) < >public void mouseEntered(MouseEvent якщо є);

public void mouseExited (MouseEvent якщо є) < >>

Це вперше у вас сніжинка. Інші користувачі createimage (). Цей метод визначений вкласу component. Тому його можна використовувати практично в будь-якому місці аплету:

Image offScreenlmage = createimage(width, height);

Клас image містить метод getGraphics(), цей метод повертає об'єкт

Graphics offscreenGraphics = offScreenlmage.getGraphics();

Тепер можна використовувати малювання. Все малювання буде здійснено

на прихованому малюнку:

Після того, як картинка намальована, її можна скопіювати в інший графічний контекст за допомогою методу drawimage():

Приховані зображення можна використовувати для вирішення завдання відновлення зображень після того, як область аплета була невидимою.

Джерело: Буділов В. А. Інтернет-програмування на Java. - СПб.: БХВ-Петербург, 2003. - 704 е.: іл.