Иллюстрированный самоучитель по Java



              

Анимация - часть 2


Метод repaint о ждет, когда представится вшможность перер/иеозать

окне,

и потом обращается к методу update (Graphics gj. При этом нескольку обращений к repaint о могут быть произведены исполняющей системой Java за один раз.

Метод update() сначала обращается к методу g.ciearRectO, заполняющему окно цветом фона, а уж затем к методу paint (g). Полный исходный текст таков:

public void update(Graphics g){

if ((this instanceof java.awt.Canvas) ||

(this instanceof java.awt.Panel)      || 

(this instanceof java.awt.Frame)      || 

(this instanceof java.awt.Dialog)     ||

(this instanceof java.awt.Window)){

g.clearRect(0, 0, width, height); 

}

paint(g); 

}

Если кадры анимации полностью перерисовывают окно, то его очистка методом clearRecto не нужна. Более того, она часто вызывает неприятное мерцание из-за появления на мгновение белого фона. В таком случае надо сделать следующее переопределение:

public void update(Graphics g) { 

paint(g);

В листинге 15.9 это переопределение сделано как комментарий.

Для "легких" компонентов дело обстоит сложнее. Метод repaint () последовательно обращается к методам repaint () объемлющих "легких" контейнеров, пока не встретится "тяжелый" контейнер, чаще всего это экземпляр класса Container. В нем вызывается метод update о, очищающий и перерисовывающий контейнер. После этого идет обращение к методам update о всех "легких" компонентов в контейнере.

Отсюда следует, что для устранения мерцания "легких" компонентов необходимо переопределять метод update о первого объемлющего "тяжелого" контейнера, обращаясь в нем к методам super.update (g) или super.paint(g).

Если кадры покрывают только часть окна, причем каждый раз новую, то очистка окна необходима, иначе старые кадры останутся в окне, появится "хвост". Чтобы устранить мерцание, используют прием, получивший название

"двойная буферизация "

(double buffering).




Содержание  Назад  Вперед