Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Простейший пример
Создание двух потоков
Управление потоками
Спрайтовая анимация
Панели с двигающимся текстом
Бегущая строка с мерцанием
Устранение мерцания
Поток для записи в файл
Контроль за выводом в файл
Чтение с сервера Web

Назад Вперед

6.7. Устранение мерцания

Пример демонстрирует способ устранения эффекта мерцания в бегущей строке, основанный на использовании предварительной подготовки изображения в оперативной памяти и метода update.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

Эффект мерцания бегущей строки, проявляющийся в предыдущем приложении, можно устранить. Для этого нужно отказаться от перерисовки строки в методе paint, так как данный метод перед перерисовкой стирает содержимое окна. Вместе с методом paint мы воспользуемся методом update, который такое стирание не выполняет.

Другая причина мерцания - рисование изображения методом paint выполняется по частям. Дело в том, что как мы уже говорили, процесс перерисовывания окна аплета, включает в себя процедуру стирания фона окна аплета. Этот процесс занимает больше времени, чем период развертки изображения по вертикали на экране монитора. В результате возникает мерцание.

Прежде чем рисовать изображение, в новом примере аплета мы подготавливаем его в памяти как объект класса Image, и лишь после подготовки отображаем в окне аплета.

Описание примера

Внешний вид окна аплета, исходные тексты которого приведены в этом разаделе библиотеки примеров, показан на рис. 1.

pic1.gif (4618 bytes)

Рис. 1. Бегущая строка отображается без мерцания

Так как данный пример подготовлен на базе предыдущего, то мы опишем здесь лишь основные отличия.

Главный класс аплета

В главном классе аплета мы дополнительно определили поле mImg класса Image. Здесь будет хранится ссылка на изображение, подготовленное в оперативной памяти.

Image mImg;

Метод update

Этот метод, определенный в классе Component, при перерисовке окна компонента устанавливает цвет фона и изображения в окне, а затем вызывает метод paint для полной перерисовки компонента.

Рассмотрим, что делает наша реализация этого метода.

В переменной gImg будет хранится ссылка на контекст отображения битового изображения, размещенного в памяти:

Graphics gImg = null;

Поле dmImg будет хранить размеры указанного изображения:

Dimension dmImg = null;

Первым делом метод update определяет размеры окна аплета:

Dimension dm = getSize();
int wndWidth = dm.width;
int wndHeight = dm.height;

Далее он проверяет, было ли уже создано графическое изображение и соответствуют ли его размеры размерам окна аплета:

if((dmImg == null) ||
   (dmImg.width != wndWidth) ||
   (dmImg.height != wndHeight))
{
  dmImg = new Dimension(wndWidth, wndHeight);
  mImg = createImage(wndWidth, wndHeight);
  gImg = mImg.getGraphics();
}

Если это не так, мы создаем новое изображение методом createImage, причем размеры этого изображения будут в точности равны размерам окна аплета.

Далее метод update определяет цвет фона и изображения окна аплета, устанавливая в контексте отображения цвет фона, соответствующий цвету фона окна аплета:

Color fg = getForeground();
Color bg = getBackground();
gImg.setColor(bg);

Теперь мы закрашиваем изображение:

gImg.fillRect(0, 0, 
  dmImg.width, dmImg.height);

В контексте изображения мы устанавливаем такой же цвет фона, что и в окне аплета:

gImg.setColor(fg);

Затем рисуем строку в контексте изображения:

gImg.setFont(
  new Font("Helvetica", Font.BOLD, 50));
gImg.drawString(szScrolledText,
  nPosition, nTitleHeight + 10);

Нарисовав строку, мы уменьшаем текущую позицию рисования строки на единицу и перерисовываем окно, вызывая напрямую метод paint:

nPosition--;
if(nPosition < -nStrLength)
  nPosition = getSize().width;

paint(g);

Заметим, что обычно приложения никогда не вызывают метод paint напрямую. Однако в нашем случае это приходится делать, так как мы переопределили метод update.

Метод paint

Какая же работа осталась для метода paint?

Он просто рисует в окне аплета изображение, подготовленное в оперативной памяти методом update:

public void paint(Graphics g)
{
  if(mImg != null)
    g.drawImage(mImg, 0, 0, null);
}

Такая процедура не приводит к возникновению мерцания.


Назад Вперед

[Назад]