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

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

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

Назад Вперед

6.6. Бегущая строка с мерцанием

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

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

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

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

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

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

Несмотря на простоту этот способ обладает одним существенным недостатком: изображение сильно мерцает.

О том, почему возникает мерцание, вы узнаете из описания следующего примера. Там же мы покажем способ устранения мерцания.

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

На рис. 1 показано окна аплета с бегущей строкой.

pic1.gif (4669 bytes)

Рис. 1. Бегущая строка в окне сильно мерцает

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

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

Главный класс нашего аплета создан на базе класса Applet и реализует интерфейс Runnable:

import java.applet.*;
import java.awt.*;

public class Scroll1 extends Applet
  implements Runnable
{
  . . .
}

В поле timerThread хранится ссылка на поток, периодически перерисовывающий окно аплета:

Thread timerThread = null;

В поле szScrolledText находится сдвигаемый текст:

String szScrolledText = 
    "Welcome to Java applets!";

Следующие три поля хранят, соответственно, количество символов в строке, текущую позицию для отображения строки и высоту символов строки:

int nStrLength;
int nPosition;
int nTitleHeight;

Метод init

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

Graphics g = getGraphics();

Далее мы устанавливаем начальную позицию для вывода строки:

nPosition = getSize().width;

Строка будет выводится начиная с правого края окна аплета.

На следующем этапе мы устанавливаем в контексте отображения новый шрифт и определяем метрики шрифта:

g.setFont(new Font(
      "Helvetica", Font.BOLD, 50));
FontMetrics fm = getFontMetrics(g.getFont());

Пользуясь метриками, мы определяем полную длину сдвигаемой строки nStrLength и ее высоту nTitleHeight:

nStrLength = fm.stringWidth(szScrolledText);
nTitleHeight = fm.getHeight();

Метод paint

Во время перерисовки окна метод paint выбирает нужный шрифт и рисует строку в текущей позиции:

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

Эта позиция затем уменьшается на единицу и сравнивается с полной длиной строки:

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

При достижении конца строки текущая позиция устанавливается в исходное состояние - на правый край окна аплета.

Методы start и stop

Эти методы управляют работой потока анимации и не имеют никаких особенностей:

public void start()
{
  if (timerThread == null)
  {
    timerThread = new Thread(this);
    timerThread.start();
  }
}
  
public void stop()
{
  if (timerThread != null)
  {
    timerThread.stop();
    timerThread = null;
  }
}

Метод run

Задача метода run заключается в периодической перерисовке окна аплета, которая выполняется в цикле с небольшой задержкой:

public void run()
{
  while (true)
  {
    try
    {
      repaint();
      Thread.sleep(30);
    }
    catch (InterruptedException ie)
    {
      stop();
    }
  }
} 

Назад Вперед

[Назад]