Как избежать "мелькания" при частой перерисовке изображения в апплете?
В этом случае часто применяется технология "виртуального окна". Для этих целей используется класс BufferedImage, который позволяет в оперативной памяти создать "виртуальное окно", куда происходит весь вывод информации. В заданные моменты изображение должно копироваться в реальное окно. Таким образом, последовательность работы будет такова:
- Подключаем нужный пакет
import java.awt.image.BufferedImage;
- В класс-апплет вводим новые переменные:
BufferedImage image; // виртуальное окно
Graphics imageGr; // совместимый графический контекст
- В методе init апплета требуется создать виртуальное окно и совместимый графический контекст:
image=new BufferedImage(width, height,
BufferedImage.TYPE_BYTE_INDEXED);
imageGr=image.getGraphics();
- Далее весь вывод производится в контекст imageGr, например,
imageGr.setColor(Color.red);
imageGr.fillRect(100,100,200,200);
- В момент, когда потребуется перенести содержимое виртуального окна в реальное окно, вызывается следующая функция для контекста реального окна в методе paint апплета
public void paint(Graphics g)
{
// ...
g.drawImage(image,0,0, width, height,null);
}
- И, наконец, главный секрет - надо переопределить метод update(). На самом деле даже если вы не включали этот метод в свою программу, он там уже присутствует (неявно) - и всё, что он делает, это очистка экрана перед перерисовкой. Но мы-то заменим весь кадр целиком, поэтому очистка экранного изображения просто не нужна. И даже вредна - потому что вызовет мерцание (ведь экран сначала будет очищаться, а только затем заполняться новым кадром). А чтобы избавиться от этого, переопределим метод следующим образом:
public void update(Graphics g){
paint(g);
}
Практическое применение
|