Анимация
Обратите внимание на следующее важное обстоятельство. Мы не можем обратиться прямо к методу paint () для перерисовки окна компонента, потому что выполнение этого метода связано с операционной системой – метод paint () выполняется автоматически при каждом изменении содержимого окна, его перемещении и изменении размеров. Для запроса на перерисовку окна в классе component есть метод repaint ().
Метод repaint () ждет, когда представится возможность перерисовать окно, и потом обращается к методу update (Graphics g). При этом нескольку обращений к repaint () могут быть произведены исполняющей системой Java за один раз.
Метод update() сначала обращается к методу g.clearRect(), заполняющему окно цветом фона, а уж затем к методу 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); }
Если кадры анимации полностью перерисовывают окно, то его очистка методом clearRect() не нужна. Более того, она часто вызывает неприятное мерцание из-за появления на мгновение белого фона. В таком случае надо сделать следующее переопределение:
public void update(Graphics g) { paint(g);
В листинге 15.9 это переопределение сделано как комментарий.
Для "легких" компонентов дело обстоит сложнее. Метод repaint () последовательно обращается к методам repaint () объемлющих "легких" контейнеров, пока не встретится "тяжелый" контейнер, чаще всего это экземпляр класса Container. В нем вызывается метод update о, очищающий и перерисовывающий контейнер. После этого идет обращение к методам update () всех "легких" компонентов в контейнере.
Отсюда следует, что для устранения мерцания "легких" компонентов необходимо переопределять метод update () первого объемлющего "тяжелого" контейнера, обращаясь в нем к методам super.update (g) или super.paint(g).
Если кадры покрывают только часть окна, причем каждый раз новую, то очистка окна необходима, иначе старые кадры останутся в окне, появится "хвост". Чтобы устранить мерцание, используют прием, получивший название "двойная буферизация" (double buffering).