Выбираем случайный цвет для рисования
dimAppWndDimension = Appl.size();
}
// -------------------------------------------------------
// run
// Метод, который работает в рамках отдельной задачи
// Он рисует в окне аплета эллипсы случайного
// цвета, размера и расположения
// -------------------------------------------------------
public void run()
{
while (true)
{
int x, y, width, height;
int rColor, gColor, bColor;
// Выбираем случайным образом размеры
// и расположение рисуемого эллипса
x = (int)(dimAppWndDimension.width * Math.random());
y = (int)(dimAppWndDimension.height * Math.random());
width = (int)(dimAppWndDimension.width *
Math.random()) / 2;
height = (int)(dimAppWndDimension.height *
Math.random()) / 2;
// Выбираем случайный цвет для рисования эллипса
rColor = (int)(255 * Math.random());
gColor = (int)(255 * Math.random());
bColor = (int)(255 * Math.random());
// Устанавливаем выбранный цвет
// в контексте отображения
g.setColor(new Color(rColor, gColor, bColor));
// Рисуем эллипс
g.fillOval(x, y, width, height);
// Выполняем задержку на 50 миллисекунд
try
{
Thread.sleep(50);
}
catch (InterruptedException e)
{
stop();
}
}
}
}
В листинге 1.6 мы привели исходный текст документа HTML, предназначенного для совместной работы с нашим приложением.
Листинг 1.6. Файл MultiTask2\ MultiTask2.html
<html>
<head>
<title>MultiTask2</title>
</head>
<body>
<hr>
<applet
code=MultiTask2.class
id=MultiTask2
width=320
height=240 >
</applet>
<hr>
<a href="MultiTask2.java">The source.</a>
</body>
</html>
s[0] = m_String1;
s[1] = m_String2;
s[2] = m_String3;
s[3] = m_String4;
s[4] = m_String5;
s[5] = m_String6;
// Получаем контекст отображения
Graphics g = getGraphics();
Dimension dimAppWndDimension = size();
// Определяем метрики текущего шрифта
FontMetrics fm = g.getFontMetrics();
// Сохраняем полную высоту символов шрифта
yChar = fm.getHeight();
// Бесконечный цикл сдвига строк
while (true)
{
try
{
// Увеличиваем содержимое счетчика сдвигов
ShiftsCounter++;
// Если сдвинута полная строка, рисуем
// следующую строку в нижней части окна
if(ShiftsCounter == yChar + 5)
{
// Сбрасываем счетчик сдвигов
ShiftsCounter = 0;
// Первую строку отображаем красным цветом,
// остальные - черным
if(CurrentStr == 0)
g.setColor(Color.red);
else
g.setColor(Color.black);
// Рисуем строку
g.drawString(s[CurrentStr],
10, dimAppWndDimension.height - 10);
// Увеличиваем счетчик строк
CurrentStr++;
// Если уже нарисовали шесть строк, сбрасываем
// счетчик строк
if(CurrentStr > 5)
CurrentStr = 0;
}
// Устанавливаем шаг сдвига равным одному пикселу
yShift = 1;
// Выполняем свертку
g.copyArea(0, yShift + 1,
dimAppWndDimension.width - 1,
dimAppWndDimension.height - 1,
0, -yShift);
// Закрашиваем область ввода желтым цветом
g.setColor(Color.yellow);
g.fillRect(1, dimAppWndDimension.height
- yShift - 1,
dimAppWndDimension.width - 2,
dimAppWndDimension.height - 1);
// Выполняем задержку в 50 миллисекунд
Dimension dimAppWndDimension = size();
// Определяем метрики текущего шрифта
FontMetrics fm = g.getFontMetrics();
// Номер текущего рисуемого символа строки
int nCurrentChar = 0;
// Позиция для рисования по вертикали
int yPos = fm.getHeight() + 5;
// Текущая позиция рисования символа по горизонтали
int nCurrentXPos = 10;
// Ширина текущего символа в пикселах
int nCurrentCharWidth;
// Бесконечный цикл рисования
while (true)
{
try
{
try
{
// Определяем ширину текущего символа
nCurrentCharWidth =
fm.charWidth(m_Str.charAt(nCurrentChar));
// Массив для преобразования кода символа в сивол
char[] ch;
// Временная строка
String s;
// Создаем массив из одного элемента
ch = new char[1];
// Записыаем в него код нажатой клавиши
ch[0] = m_Str.charAt(nCurrentChar);
// Преобразуем в строку
s = new String(ch);
// Рисуем текущий символ в текущей позиции
g.drawString(s, nCurrentXPos, yPos);
// Увеличиваем текущую позицию на ширину
// нарисованного символа
nCurrentXPos += nCurrentCharWidth;
// Переходим к следующему символу в строке
nCurrentChar++;
}
// Обработка выхода за пределы строки
catch (StringIndexOutOfBoundsException e)
{
// Сбрасываем номер текущего символа и
// текущую позицию
nCurrentChar = 0;
nCurrentXPos = 10;
// Перерисовываем окно аплета
repaint();
// Задержка после перерисовки окна
try
{
Thread.sleep(500);
}
catch (InterruptedException ee)
{
stop();
Thread STask;
// -------------------------------------------------------
// Конструктор класса NotifyTask
// -------------------------------------------------------
public NotifyTask(Thread SynchroTask)
{
// Сохраняем ссылку на задачу, которую необходимо
// разблокировать
STask = SynchroTask;
}
// -------------------------------------------------------
// run
// Метод, который работает в рамках отдельной задачи и
// периодически разблокирует задачу STask
// -------------------------------------------------------
public void run()
{
while (true)
{
// Выполняем задержку на 30 миллисекунд
try
{
Thread.sleep(30);
}
catch (InterruptedException e)
{
}
// Получаем объект STask в монопольное владение
// и вызываем для него метод notify,
// разблокируя работу соотвестсвующей задачи
synchronized(STask)
{
STask.notify();
}
}
}
}
Файл документа HTML, созданный автоматически для нашего аплета, вы найдете в листинге 1.12.
Листинг 1.12. Файл Synchro\Synchro.html
<html>
<head>
<title>Synchro</title>
</head>
<body>
<hr>
<applet
code=Synchro.class
id=Synchro
width=320
height=240 >
</applet>
<hr>
<a href="Synchro.java">The source.</a>
</body>
</html>
Содержание раздела