Улучшение изображения двойной буферизацией
Суть двойной буферизации в том, что в оперативной памяти создается буфер – объект класса image или Bufferedimage, и вызывается его графический контекст, в котором формируется изображение. Там же происходит очистка буфера, которая тоже не отражается на экране. Только после выполнения всех действий готовое изображение выводится на экран.
Все это происходит в методе update(), а метод paint () только обращается к update (). Листинги 15.10-15.11 разъясняют данный прием.
Листинг 15.10. Двойная буферизация с помощью класса image.
public void update(Graphics g){ int w = getSize().width, h = getSize().height; // Создаем изображение-буфер в оперативной памяти Image offlmg = createlmage(w, h); // Получаем его графический контекст Graphics offGr = offImg.getGraphics(); // Меняем текущий цвет буфера на цвет фона offGr.setColor(getBackground()); //и заполняем им окно компонента, очищая буфер offGr.fillRect(0, 0, w, h); // Восстанавливаем текущий цвет буфера offGr.setColor(getForeground()); // Для листинга 15.9 выводим в контекст изображение offGr.drawlmage(img[count % 10], 0, 0, this); // Рисуем в графическом контексте буфера // (необязательное действие) paint(offGr); // Выводим изображение-буфер на экран // (можно перенести в метод paint()) g.drawlmage(offlmg, 0, 0, this); } // Метод paint() необязателен public void paint(Graphics g)J update(g); }
Листинг 15.11. Двойная буферизация с помощью класса Bufferedimage.
public void update(Graphics g){ Graphics2D g2 = (Graphics2D},g; int w = getSize().width, h = getSize().height; // Создаем изображение-буфер в оперативной памяти Bufferedimage bi = (Bufferedimage)createlmage(w, h); // Создаем графический контекст буфера Graphics2D big = bi.createGraphics(); // Устанавливаем цвет фона big.setColor(getBackground()); // Очищаем буфер цветом фона big.clearRect(0, 0, w, h); // Восстанавливаем текущий цвет big.setColor(getForeground()); // Выводим что-нибудь в графический контекст big //… // Выводим буфер на экран g2.drawImage(bi, 0, 0, this); }
Метод двойной буферизации стал фактическим стандартом вывода изменяющихся изображений, а в библиотеке Swing он применяется автоматически.
Данный метод удобен и при перерисовке отдельных частей изображения. В этом случае в изображении-буфере рисуется неизменяемая часть изображения, а в методе paint() – то, что меняется при каждой перерисовке.