Назад
Вперед
1.16. Цифровые часы в документе HTML
На примере цифровых часов, встроенных в
документ HTML как аплет, мы демонстрируем
использование различных методов класса Date. Этот
класс позволяет узнавать и устанавливать
календарную дату и время.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java)
Немного теории
С помощью методов класса Date автономное
приложение Java или аплет может определить или
установить текущую дату и время. При этом
некоторые методы возвращают дату в виде
текстовой строки в стандарте координированного
универсального времени UTC (Coordinated Universal Time),
некоторые в локальном стандарте, а некоторые
пригодятся для извлечения отдельных компонент
даты.
Например, с помощью таких методов как getYear, get Date
и getDay приложение обычно определяет номера года,
месяца и дня недели. Методы getHours, getMinutes и getSeconds
позволяют узнать, соответственно, количество
часов, прошедших с момента начала суток,
количество минут от начала текущего часа и
количество секунд от начала текущей минуты.
В классе Date есть также методы для установки
текущей даты и времени, а также для определения
смещения локального часового пояса.
Описание примера
Аплет JavaClock отображает текущее время
одновременно в нескольких форматах, получая
информацию о дате и времени различными способами
(рис. 1).
Рис. 1. Отображение даты и времени в окне аплета
JavaClock
Этот аплет создан как многопоточное
приложение. Главный поток, выполняющий рисование
в окне аплета, запускает поток ClockUpdate.
Единственная задача этого потока - периодическая
перерисовка окна аплета, выполняемая каждую
секунду. С таким периодом вызывается метод paint
класса JavaClock, отображающий время.
Класс JavaClock
Перейдем к описанию исходного текста примера.
При этом мы сконцентрируем внимание в основном
на методе paint, в теле которого выполняется
обращение к методам класса Date.
Внутри тела этого метода мы создали переменные
yStart и yCurrent типа int, а также рабочую строку szDate:
int yStart = 20;
int yCurrent = yStart;
String szDate;
В переменной yStart хранится координата по оси Y
верхней границы области окна аплета,
использованной для отображения времени. В
процессе вывода отдельные строки отображаются
со смещением yCurrent.
Каждый раз при выводе новой строки это смещение
увеличивается на высоту символов текущего
шрифта, выбранного в контекст отображения. Чтобы
определить эту высоту, мы создаем объект fm класса FontMetrics:
FontMetrics fm = g.getFontMetrics();
При этом метод getHeight, определенный в классе
FontMetrics, возвратит нам искомую высоту символов.
Для определения текущей даты и времени метод
paint создает объект dt класса Date:
Date dt = new Date();
Затем метод paint выводит красным цветом название
метода, с помощью которого получена информация о
дате. Например:
g.setColor(Color.red);
g.drawString("toString()", 10, yCurrent);
yCurrent += fm.getHeight();
g.setColor(Color.black);
Здесь выводится надпись для метода toString.
Вызывается этот метод следующим образом:
szDate = dt.toString();
Полученная строка отображается в окне аплета
при помощи метода drawString:
g.drawString(szDate, 10, yCurrent);
yCurrent += fm.getHeight();
yCurrent += fm.getHeight();
При этом формат строки совпадает с тем, что
используется функцией ctime стандартной
библиотеки языка Си.
Если вам нужно получить строку времени в
локальном формате, зависящем от локальных
национальных настроек операционной системы,
воспользуйтесь методом toLocaleString. Наша программа
вызывает его так:
szDate = dt.toLocaleString();
Смещение локального часового пояса нетрудно
определить методом getTimezoneOffset:
int off = dt.getTimezoneOffset();
szDate = "Time offset, minutes: " + off;
Этот метод возвращает значение смещения в
минутах.
Последнее, что делает метод paint, это отображает
строки даты и времени, составленные из отдельных
компонент. Компоненты даты и времени
определяются при помощи таких методов, как getYear и
getHours:
szDate = "Year: " + dt.getYear() +
", Month: " + dt.getMonth() +
", Date: " + dt.getDate() +
", Day: " + dt.getDay();
g.drawString(szDate, 10, yCurrent);
yCurrent += fm.getHeight();
szDate = "Hours: " + dt.getHours() +
", Minutes: " + dt.getMinutes() +
", Seconds: " + dt.getSeconds();
g.drawString(szDate, 10, yCurrent);
Обращаем ваше внимание на то, что метод getMonth
возвращает значения в диапазоне от 0 до 11. При
этом 0 соответствует январю, а 11 - декабрю.
Метод getDay возвращает номер дня недели в
диапазоне от 0 до 6. Нумерация дней недели
начинается с воскресенья (0), затем идет
понедельник (1), вторник (2) и так далее до субботы
(6).
Теперь кратко о других методах, определенных в
классе JavaClock.
Метод start получает управление при активизации
аплета и запускает поток ClockUpdate, обновляющий
показания часов:
public void start()
{
if (m_ClockUpdate == null)
{
m_ClockUpdate = new ClockUpdate(this);
m_ClockUpdate.start();
}
}
Конструктору класса ClockUpdate мы передаем ссылку
на аплет. Данная ссылка будет использована для
перерисовки окна аплета методом repaint.
Метод stop останавливает поток ClockUpdate, когда
документ HTML с нашими электронными часами
исчезает из окна браузера:
public void stop()
{
if (m_ClockUpdate != null)
{
m_ClockUpdate.stop();
m_ClockUpdate = null;
}
}
Класс ClockUpdate
Исходный текст этого класса, созданного на базе
Thread, очень прост. В нем мы определили конструктор
и метод run.
Конструктор сохраняет ссылку на аплет,
переданную ему в качестве параметра, в поле App,
определенном в классе ClockUpdate:
public ClockUpdate(Applet Appl)
{
App = Appl;
}
Что же касается метода run, то он работает в
отдельном потоке.
Тело метода представляет собой бесконечный
цикл, в котором для аплета App вызывается метод
repaint:
public void run()
{
while (true)
{
App.repaint();
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
stop();
}
}
}
Этот метод перерисовывает окно аплета.
После вызова метода repaint в цикле выполняется
задержка на одну секунду, для чего вызывается
метод sleep из класса Thread.
Назад Вперед |